贪心(Greedy algorithm)

news2024/11/25 4:28:58

众所不周知,贪心就是一种每次都抢局部最优解的算法(这样的确很贪),但是想要证明贪心的正确性很难。但在比赛中,尤其是不会写DP的你,可以选择大胆尝试,写一个贪心,万一对了呢 (:

本期博客将介绍两种贪心的方法:优先队列回撤贪心&相邻交换。

Part 1:优先队列回撤贪心

我们还是看题吧。

P4053:

此题一(亿)看就只是贪心,但是不会。这里有两个参数:修理建筑的时间和报废的时间。该怎么权衡这两个呢?大家可以先自己想一会。

有思路了吗?其实,没有你想的辣么难,我们可以按报废的时间排序,然后一个优先队列维护,每次加入一个建筑,只要发现它报废了,就把当前堆里最小的那个(也是top)踢出去就可以了。而这,就叫优先队列回撤贪心。怎么样,不难吧。然后放个代码。

#include <bits/stdc++.h>
using namespace std;
struct building{
	int t1;
	int t2;
}buildings[150005];
bool cmp(building a,building b){
	return a.t2<b.t2;
}
priority_queue<int> pq;
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>buildings[i].t1>>buildings[i].t2;
	sort(buildings+1,buildings+n+1,cmp);
	int sum=0,ans=0;
	for(int i=1;i<=n;i++){
		sum+=buildings[i].t1;
		pq.push(buildings[i].t1);//入队
		if(sum<=buildings[i].t2)
			ans++;
		else{//把堆顶踢出去
			sum-=pq.top();
			pq.pop();
		}
	}
	cout<<ans<<endl;
	return 0;
}

注意要开long long。

P3545:

思路和上一题大差不差。直接看代码吧,有注释。

#include <bits/stdc++.h>
using namespace std;
int a[250005],b[250005];
struct costumer{
	int req;
	int idx;
};
bool operator < (const costumer& x,const costumer& y){
	return x.req<y.req;
}
priority_queue<costumer> pq;//当前满足的顾客的堆,堆顶是需求最大的客户 
int ans[250005];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
		cin>>b[i];
	long long ad=0,goods=0;//ad是总需求,goods是总进货数
	for(int i=1;i<=n;i++){
		goods+=a[i];//进货 
		pq.push((costumer){b[i],i});
		ad+=b[i];//尝试满足第i个人的需求
		if(ad>goods){//不够 
			ad-=pq.top().req;
			pq.pop();
		}
	}
	int tot=0;
	while(!pq.empty()){
		ans[++tot]=pq.top().idx;
		pq.pop();
	}
	cout<<tot<<endl;
	for(int i=1;i<=tot;i++)
		cout<<ans[i]<<' ';
	return 0;
}
十年OI一场空,不开long long见祖宗!

Part 2:相邻交换法

到这趴就得要亿点点数学了。老规矩,看题。

AcWing 58:

难得一道AcWing的题目。

我当时:乍一看,简单!再一看,诶,有点......难...... 再想一会,我根本不会......

言归正传,首先肯定是string输入输出滴,然后就是去排序。怎么个排法呢?

结论:如果 ab > ba,那么就交换a,b在数组内的位置!            But, WHY?

很多人应该都不理解(我一开始也不懂),但就是猜对了,很神奇。

首先,直接比较大小肯定不行。那怎么确定谁在左边呢?我们用位置原理展开一下。

假设A_{n-1}A_{n-2}......A_1A_0B_{n-1}B_{n-2}......B_{1}B_{0}是两个要比较的数。用位置原理得到这个鬼玩意:A_{n-1}*10^{n-1}+A_{n-2}*10^{n-2}+......+A_1*10+A_0,B同理。然后我们把A在左和B在左分别表示出来,用小于号连接,变成一个很神奇很长打的我都不想再打的一坨式子:10^m*(A_{n-1}*10^{n-1}+A_{n-2}*10^{n-2}+......+A_1*10+A_0)+B_{m-1}*10^{m-1}+B_{m-2}*10^{m-2}+......+B_1*10+B_0<10^n*(B_{n-1}*10^{n-1}+B_{n-2}*10^{n-2}+......+B_1*10+B_0)+A_{m-1}*10^{m-1}+A_{m-2}*10^{m-2}+......+A_1*10+A_0

然后开始抵消,A往左边放,B往右边放,就成了这样:(10^m-1)\times A<(10^n-1)\times B继续化简:A/(10^n-1)<B/(10^m-1)。好了,结束了,满足传递性,排序一遍就万事大吉了!!!!!!!!!!!

#include <bits/stdc++.h>
using namespace std;
string num[10005];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>num[i];
	sort(num,num+n,[](string x,string y){return x+y<y+x;});
	string ans="";
	for(string x:num)
		ans+=x;
	cout<<ans<<endl;
	return 0;
}

代码超简单。

P1080:

最后一题了。这题还是很有难度的(毕竟是提高组的)。首先,我们知道你交换两个大臣(x和y),其他大臣的奖金是不变的,只会影响它们两个本身。其次,这会出现四个值(xy顺序有两种,每个顺序还要分别考虑x和y的奖金),所以答案就变成了max(a,b)<max(c,d)(A是xy中的x,B是xy中的y,C是yx中的y,D是yx中的x)不太好处理了。没关系,把ABCD分别写出来,会发现AD同分母且A<D;BC同分母,且B>C。所以,B必然小于D因为max(a,b)<max(c,d),然后就找到了排序方法:

bool cmp(minister x,minister y){
	return x.l*x.r<y.l*y.r;
}

接下来就完事大吉了,注意需要高精(Python在狂笑)。

#include <bits/stdc++.h>
using namespace std;
struct minister{
	int l;
	int r;
}ministers[1005];
int product[10005],ans[10005],tmp[10005];
bool cmp(minister x,minister y){
	return x.l*x.r<y.l*y.r;
}
void copy(int x[],int y[]){
	for(int i=0;i<10005;i++)
		x[i]=y[i];
}
bool compare(int x[],int y[]){
	for(int i=10004;i>=0;i--){
		if(x[i]>y[i])
			return true;
		if(x[i]<y[i])
			return false;
	}
	return false;
}
void multiply(int multipler[],int num){
	for(int i=10003;i>=0;i--)
		multipler[i]*=num;
	for(int i=0;i<10004;i++){
		multipler[i+1]+=(multipler[i]/10);
		multipler[i]%=10;
	}
}
void divide(int dividend[],int res[],int num){
	memset(res,0,sizeof(res));
	int x=0;
	for(int i=10004;i>=0;i--){
    	x=x*10+dividend[i];
		res[i]=x/num;
		x%=num;
	}
}
int main(){
	int n;
	cin>>n;
	for(int i=0;i<=n;i++)
		cin>>ministers[i].l>>ministers[i].r;
	sort(ministers+1,ministers+n+1,cmp);
	product[0]=1;
	for(int i=0;i<=n;i++){
		divide(product,tmp,ministers[i].r);
		if(compare(tmp,ans))
			copy(ans,tmp);
		multiply(product,ministers[i].l);
	}
	bool flag=false;
	for(int i=10004;i>=0;i--){
		if(!flag){
			if(ans[i])
				flag=true;
			else
				continue;
		}
		cout<<ans[i]<<' ';
	}
	return 0;
}

施工完毕。

温馨提示:本期的代码都直接提交均无法AC,请不要无脑Ctrl C+Ctrl V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1426679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

张维迎《博弈与社会》多重均衡与制度和文化(3)法律和社会规范的协调作用

社会博弈通常存在多个纳什均衡。许多情况下&#xff0c;多个纳什均衡之间并不存在优劣之分&#xff1b;即使有优劣之分&#xff0c;也很难通过无成本的交流而选择一个特定的纳什均衡。这就产生了对制度和文化的需求。社会制度和社会规范&#xff08;文化、习惯等&#xff09;的…

2024年美赛 (A题MCM)| 海蟒鳗鱼 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看美赛的A题&#xff01; 完整内容可以在文章末尾领…

纳毕化学携手隆道打造数字化采购平台 推动采购业务管理能力升级

近期&#xff0c;纳毕化学集团有限公司&#xff08;以下简称“纳毕化学”&#xff09;与北京隆道网络科技有限公司合作&#xff0c;共同推出的“纳毕E-Trade采供协同云平台”正式上线运行&#xff0c;助力纳毕化学有效提升采购效率&#xff0c;降低采购成本&#xff0c;实现更加…

【C/C++】C/C++编程——整型(二)

在 C 中&#xff0c;整型数据可以分为有符号数&#xff08;Signed&#xff09;和无符号数&#xff08;Unsigned&#xff09;&#xff0c;这两种类型主要用于表示整数值&#xff0c;但它们在表示范围和用途方面有所不同。默认情况下&#xff0c;整数类型如 int、short、long 都是…

应用智能家居领域中的低功耗蓝牙模块

智能家居&#xff08;smart home, home automation&#xff09;是以住宅为平台&#xff0c;利用综合布线技术、网络通信技术、 安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成&#xff0c;构建高效的住宅设施与家庭日程事务的管理系统&#xff0c;提升家居安…

【Cocos入门】Cocos resources 加载资源

目录 动态加载 resources加载 SpriteFrame 或 Texture2D加载图集中的 SpriteFrame加载 FBX 或 glTF 模型中的资源资源批量加载预加载资源加载远程资源和设备资源 动态加载 resources 通常我们会把项目中需要动态加载的资源放在 resources 目录下&#xff0c;配合 resources.lo…

Java方法的定义、调用和冲载

目录 什么是方法方法的定义方法的声明方法声明的格式 方法的调用方式方法调用实例面试题在内存中的变化 方法的重载 什么是方法 方法(method)就是一段用来完成特定功能的代码片段&#xff0c;类似于其它语言的函数(function)。 方法用于定义该类或该类的实例的行为特征和功能实…

sqli.labs靶场(23关到28a关)

23、第二十三关 id1单引号闭合 找位置1 and 12 union select 1,2,3 爆库&#xff1a;1 and 12 union select 1,2,database() 爆表名&#xff1a;1 and 12 union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity 爆字段&#…

【算法详解 | 二分查找】详解二分查找 \ 折半查找高效搜索算法 | 顺序数组最快搜索算法 | 递归循环解决二分查找问题

二分查找 by.Qin3Yu 本文需要读者掌握 顺序表 的操作基础&#xff0c;完整代码将在文章末尾展示。 顺序表相关操作可以参考我的往期博文&#xff1a; 【C数据结构 | 顺序表速通】使用顺序表完成简单的成绩管理系统.by.Qin3Yu 文中所有代码使用 C 举例&#xff0c;且默认已使用…

Linux管道、网络管理和远程连接

这次来说一下Linux管道、网络管理与远程连接相关的一些内容&#xff0c;如下。 一、管道&#xff08;重点&#xff09; 1、管道符 用 “|”&#xff08;竖线&#xff09;表示。 作用&#xff1a;管道是一种通信机制&#xff0c;通常用于进程间的通信。它表现出来的形式将前…

ZigBee学习——在官方例程基础实现点灯

IAR版本 :10.10.1 Z-stack版本 :3.0.2 文章目录 一、买的板子原理图二、实现过程2.1 重定义LED的物理映射(HAL层)2.2 创建LED事件(应用层)2.2.1 定义用户事件2.2.2 修改zclGenericApp_event_loop() 2.3 触发事件 一、买的板子原理图 二、实现过程 2.1 重定义LED的物理映射(HAL…

MirrorLayer可以正常触摸屏幕原理分析

背景&#xff1a; 上次blog分享了给学员朋友们布置的作业&#xff0c;今天来进行简单的揭秘。 问题&#xff1a; 在多屏互动时候有一个屏幕的画面是一个MirrorLayer&#xff0c;另一个屏幕画面是真实的&#xff0c;即2个屏幕上有一个是MirrorLayer&#xff0c;这个时候疑问就…

算法篇之二分

二分算法简介 特点 最简单的一种算法&#xff0c;也是最恶心&#xff0c;细节最多&#xff0c;最容易写出死循环的算法时间复杂度O(logN) 如何学习 明白其中的算法原理&#xff0c;二分并不是只有数组有序的的时候使用&#xff0c;而是看是否具有二段性。模板 朴素的二分模…

算法面试八股文『 基础知识篇 』

博客介绍 近期在准备算法面试&#xff0c;网上信息杂乱不规整&#xff0c;出于强迫症就自己整理了算法面试常出现的考题。独乐乐不如众乐乐&#xff0c;与其奖励自己&#xff0c;不如大家一起嗨。以下整理的内容可能有不足之处&#xff0c;欢迎大佬一起讨论。 PS&#xff1a;…

失物招领|基于Springboot的校园失物招领系统设计与实现(源码+数据库+文档)

校园失物招领系统目录 目录 基于Springboot的校园失物招领系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、 管理员功能实现 (1) 失物招领管理 (2) 寻物启事管理 (3) 公告管理 (4) 公告类型管理 2、用户功能实现 (1) 失物招领 (2) 寻物启事 (3) 公告 …

2024 美国大学生数学建模竞赛 美赛(C题)网球比赛趋势问题 国际大学生数学建模竞赛| 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍希望大家都能轻松建模呀&#xff0c;华数杯也会持续给大家放送思路滴~ 抓紧小秘籍&#xff0c;我们出发吧~ 完整内容可以在文章末尾领取&#xff01; 问题1 • 开发一个模型&#xff0c;捕捉到比赛进行时点的流动&#xff0c;…

(2)(2.11) RFD900

文章目录 前言 1 概述 2 主要功能 3 状态LED指示灯 4 接口 5 使用Mission Planner进行配置 6 支持不同国家/地区 7 讨论论坛 前言 RFD900 无线电调制解调器是一款高功率 900Mhz ISM 波段无线电调制解调器&#xff0c;设计用于远距离串行通信。据报道&#xff0c;其通信…

2024美国大学生数学建模美赛选题建议+初步分析

总的来说&#xff0c;去年算是美赛环境题元年&#xff0c;去年的开放度是较高的&#xff0c;今年每种赛题类型相对而言平均了起来 提示&#xff1a;DS C君认为的难度&#xff1a;E<BCF<AD&#xff0c;开放度&#xff1a;DBCE<A<F。 以下为A-F题选题建议及初步分析…

C++(17.5)——list模拟实现扩展

在上篇文章中&#xff0c;实现了的大部分功能以及部分迭代器。本片文章将对剩下的功能进行补充。 1. const迭代器&#xff1a; 对于上篇文章中实现的迭代器只能使用于非类型的对象。对于类型的遍历&#xff0c;则需要额外编写类型的迭代器。例如对于下面的场景&#xff1a; …

grafana安装DevOpsProdigy KubeGraf 1.5.2

安装DevOpsProdigy KubeGraf需要安装kube-state-metrics 官方地址&#xff1a;https://github.com/kubernetes/kube-state-metrics/tree/release-2.10/examples/standard 查看k8s版本和kube-state-metrics对应版本&#xff1a; [rootmaster1 kube-state-metrics]# ll 总用量 …