贪心刷题~

news2024/12/25 0:20:38

1、洛谷P2240 【深基12.例1】部分背包问题

 贪心策略:拿金币单价高的。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct gold{
	int v;
	int m;
} q[101];

bool cmp(gold a,gold b){
	return a.v*b.m>b.v*a.m;    //按金币单价大的排:a.v/a.m > b.v/b.m
}

int main()
{
	int n,T;
	cin>>n>>T;
	for(int i=0;i<n;i++)
		cin>>q[i].m>>q[i].v;
	
	sort(q,q+n,cmp);
	
	double va=0;
	int ma=T;
	for(int i=0;i<n;i++)
		if(q[i].m<=ma){    //能把这一价格的全拿完
			va+=q[i].v;
			ma-=q[i].m;
		}
		else{
			va+=1.0*q[i].v/q[i].m*ma;    //要*1.0转化为浮点数类型!!
			break;    //到这一步 说明ma=0,直接退出
		}
	printf("%.2lf",va);
	
	return 0;
}

2、洛谷P1208 [USACO1.3]混合牛奶 Mixing Milk

和上一题基本相同。。

贪心策略:拿牛奶单价低的。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct milk{
	int vv;
	int mm;
}q[50010];

bool cmp(milk a,milk b){
	return a.vv<b.vv;
}

int main()
{
	int n,m;    //n,m不要弄混了...
	cin>>n>>m;
	for(int i=0;i<m;i++)	
		cin>>q[i].vv>>q[i].mm;
	
	sort(q,q+m,cmp);
	
	int va=0,ma=n;
	for(int i=0;i<m;i++)
		if(q[i].mm<=ma){
			va+=q[i].vv*q[i].mm;
			ma-=q[i].mm;
		} 
		else{
			va+=q[i].vv*ma;
			break;
		}
	cout<<va;
	
	return 0;
}

3、洛谷P1478 陶陶摘苹果(升级版)

又一道大差不差。。

贪心策略:摘耗力小的,当然前提是要能摘到。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct apple{
	int h;
	int c;
} q[50010];

bool cmp(apple a,apple b){
	return a.c<b.c;
}

int main()
{
	int n,s,a,b;
	cin>>n>>s>>a>>b;
	for(int i=0;i<n;i++)
		cin>>q[i].h>>q[i].c;
		
	sort(q,q+n,cmp);
	
	int ans=0,rem=s;
	for(int i=0;i<n;i++)
		if(q[i].h<=a+b){
			rem-=q[i].c;

			if(rem<0)    //没有 = 哦
				break;
			else
				ans++;	
		}
	cout<<ans;
			
	return 0;
}

4、洛谷P1223 排队接水

经典的数学排队洗澡问题。。

贪心策略: 排用时少的。

用时越少的排越前面,没接水的等的时间就越少,平均等待时间就越少。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct peo{
	int t;
	int num;
} q[1010];

bool cmp(peo a,peo b){
	return a.t<b.t; 
}

int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>q[i].t;
		q[i].num=i;
	}
	
	sort(q+1,q+n+1,cmp);
	
	double sum=0;
	for(int i=1;i<=n;i++){
		cout<<q[i].num<<" ";
		
		sum+=q[i].t*(n-i);//等待总时间 = q[1].t*(n-1) + q[2].t*(n-2) +...+q[n-1].t*1
	}
	printf("\n%.2lf",sum/n);
	
	return 0;
}

5、洛谷P1094 [NOIP2007 普及组] 纪念品分组

每组最多两件,专门为双指针而出的呀! 

贪心策略:价格最低最高的礼品分一组,当然前提是满足条件;不满足则价格高的为一组,这样价格低的更可能和其他价格高的分一组,使组数最小。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
	int w,n,q[30010];
	cin>>w>>n;
	for(int i=0;i<n;i++)
		cin>>q[i];
		
	sort(q,q+n);
	
	int ans=0;
	int l=0,r=n-1;
	while(l<=r){
		if(q[l]+q[r]<=w){
			l++;
			r--;
		}
		else
			r--;
		ans++;
	}
	cout<<ans;
	
	return 0;
}

6、洛谷P4995 跳跳!

 贪心策略:在最高和最低的石头间来回横跳。

还是双指针。。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
	int n,h[310]={0};
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>h[i];
		
	sort(h+1,h+n+1);
	
	long long ans=0;    //要开long long,最大约为(10^4*10^4) * 300 > 10^9
	int l=0,r=n;	//模拟跳跃过程 
	while(l<r){
		ans+=(h[r]-h[l])*(h[r]-h[l]);
		l++;
		ans+=(h[l]-h[r])*(h[l]-h[r]);
		r--;
	}
	cout<<ans;
	
	return 0;
}

7、洛谷P1803 凌乱的yyy / 线段覆盖

贪心策略:先参加结束时间早的比赛,当然前提是这场比赛 开始时间晚于前一场比赛。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct game{
	int s;
	int e;
} q[1000010];

bool cmp(game a,game b){
	return a.e<b.e;
}

int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>q[i].s>>q[i].e;
	
	sort(q,q+n,cmp);
	
	int ans=0;
	int last=0;		//记录上一场的结束时间 
	for(int i=0;i<n;i++)
		if(last<=q[i].s){
			ans++;
			last=q[i].e;	
		}
	cout<<ans;
	
	return 0;
}

9、洛谷P5019 [NOIP2018 提高组] 铺设道路

贪心策略:若该坑深度大于前一坑,则填其深度之差。

证明:

假设现在有一个坑,但旁边又有一个坑。

你肯定会选择把两个同时减1;

那么小的坑肯定会被大的坑“带着”填掉。

大的坑也会减少a[i]-a[i-1]的深度,可以说是“免费的”;

所以这样贪心是对的。

这是一个局部策略,能使当前答案最优(比如样例里的第一个深度4,由于4比前一深度0大,所以ans要加(4-0),这放在整体上来看显然不对(2、3<4),但对于第一个深度4和其前一深度0 来说就是最优的),不能放在整体上来看。

但当所有局部最优时,这题整体就有最优(贪心嘛,废话。。)。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
	int n,d[100010]={0};
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>d[i];
	
	int ans=0;
	for(int i=1;i<=n;i++)
		if(d[i]>d[i-1])
			ans+=d[i]-d[i-1];
	cout<<ans;
	
	return 0;
}

不会贪心的话用递归也行(更直观):

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    int n,a[100010],f[100010];   //f表示最少天数
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>d[i];

	f[1]=d[1];
	for(int i=2;i<=n;i++)
	{
		if(d[i]<=d[i-1])    //d[i]<=d[i-1]时,
			f[i]=f[i-1];    //填d[i-1]时顺便填上d[i]
		else                 //不然的话,
            f[i]=f[i-1]+(d[i]-d[i-1]);//还要填上剩余的坑
	}
	cout<<f[n];

	return 0;
}

10、洛谷P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G

贪心策略:每次合并较小的堆。

合并后要将新的堆继续进行排序,用sort会TLE,

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
	int n,q[10010];
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>q[i];
	
	sort(q,q+n);
	
	int ans=0;
	int i=0;//合并次数
	while(i<n-1)
		if(q[i]){
			q[i]+=q[i+1];
			ans+=q[i];
			q[i+1]=0;
			sort(q,q+n);
			i++;
		}
	cout<<ans;	
	
	return 0;
}

但可以用STL里的优先队列priority_queue,

这样每次操作后都会自动帮你排序(也可以手写堆但我不会。。)。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>    //要引入这个头文件!
using namespace std;

int n,x,ans;
priority_queue< int,vector<int>,greater<int> >q;//greater:由小到大排列
                                                   //less:由大到小排列
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		q.push(x);
	}
	
	while(q.size()>=2){//因为每次a,b的和都会入队,所以最后一次操作后size=1,退出循环
		int a=q.top(); q.pop();//得到最小的两个数,
		int b=q.top(); q.pop();//并将其弹出队列
		ans+=a+b;
		q.push(a+b);//将其和入队
	}
	cout<<ans;
	
	return 0;
}

11、洛谷P3817 小A的糖果

先从第一个糖果盒和第二个开始; 如果一个糖果盒的数量就超限了,我们当然至少要把它吃到剩下x个; 然后如果单论两个都没有超限,但加起来超限了怎么办呢?

首先第一个糖果盒是只有一个分组的(和第二个), 而第二个糖果盒却有两个分组(和第1个/和第3个); 所以如果我们吃掉第一个里的,只会减少一个分组的量,而如果吃掉第二个里的,可以减少2个分组的量。所以我们要尽量吃掉第二个(”中间的”)里的糖果。

处理好第一个分组后,来看第二个,因为第一个分组已经被处理好了,所以可以无视它,然后问题又变成了前一个问题。 以此类推就好了。

如果不单独考虑第一个的话,因为是优先吃第二个,所以若第一个特别大,那么要使其和小于x,第二个可能会被吃到负数。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int n,x,q[100010];

int main()
{
	cin>>n>>x;
	
	long long ans=0;
	int eat;
	for(int i=1;i<=n;i++){    //q[0]=0,相当于单独考虑了第一个糖果盒
		cin>>q[i];
		if(q[i]+q[i-1]>x){
			eat=q[i]+q[i-1]-x;
			ans+=eat;
			q[i]-=eat;    //优先吃“中间的”,影响最大,最贪心
		}
	}
	cout<<ans;
	
	return 0;
}

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

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

相关文章

SpringCloud-微服务Eureka服务注册中心

微服务&服务注册中心 前言一、微服务1.什么是微服务2.单体架构和微服务架构2.1.单体架构2.2.微服务架构 二、服务注册中心1.服务注册中心简介2.Eureka服务注册中心2.1.Eureka Server开发2.2 Eureka Client开发 3.Eureka的自我保护机制3.1.Eureka自我保护机制简介3.2.Eureka…

MySQL数据库连接超时自动断开的解决方案

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

windows下msys2编译64位的ffmpeg源码

目前遇到过两次需求&#xff0c;需要编译ffmpeg源码。网上下载的编译好的源码里面可能不全&#xff0c;很多时候需要自行编译源码。本文介绍自行编译ffmpeg64位源码&#xff08;32位通过相似的方式为编译成功&#xff0c;不知道原因&#xff09; 环境&#xff1a; 2023.5.4下载…

团队密码管理器Passbolt的安装

老苏下载了吴恩达联手 OpenAI 推出的 Prompt for developer 课程&#xff0c;总长度大概在一个半小时左右&#xff0c;可以让我们学习正确的 ChatGPT Prompt 工程 虽然课程对话是英文&#xff0c;但有中文字幕&#xff0c;课程地址&#xff1a;https://www.aliyundrive.com/s/…

[Gitops--9]微服务项目sangomall代码配置修改及资源清单文件

微服务项目sangomall代码配置修改及资源清单文件 1. 中间件的地址 1.1 Nacos 集群外 nacos-server.intra.com 192.168.31.211集群内 nacos-server.sangomall.svc.cluster.local. nacos-server.sangomall.svc.cluster.local.:88481.2 Redis 集群内 redis.sangomall.svc.c…

ipad有必要用手写笔吗?电容笔和Apple pencil区别

与Apple Pencil最大的不同之处&#xff0c;在于普通的电容笔并不具备着重力压感&#xff0c;而是会给人一种倾斜的压感。如果不是频繁作画&#xff0c;那就用一支普通的电容笔。这种电容笔不但可以用于办公室&#xff0c;也可以用于记笔记、做练习。再说了&#xff0c;一支苹果…

深入理解 Linux 内核(二)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 深入理解 Linux 内核&#xff08;二&#xff09; Linux 设备驱动程序 Linux设备驱动开发详解 文章目录 系列文章目录五、定时测量1、时钟和定时器电路2、Linux 计时体系结构&#xff08;1&#xff09;计时体系机构的数据…

200G 400G光模块介绍

200G 光模块封装有2种&#xff0c;分别是QSFP56和QSFP-DD。 200G QSFP56有2种光模块&#xff0c;第一种是200G QSFP56 SR4&#xff0c;第二种是200G QSFP56 FR。 200G QSFP56 SR4的封装形式是QSFP56&#xff0c;速率是200G&#xff0c;波长是850nm&#xff0c;最远传输距离是10…

儿童书写台灯哪个牌子比较好?盘点护眼学生用台灯品牌排行

想要拥有一个健康的视力对于我们多么重要&#xff0c;日常生活多么不便利&#xff0c;就是像家里孩子考学时视力也是对于未来专业选择的一个阻碍。 想要孩子不吃近视的苦&#xff0c;从小就要开始抓孩子对于视力和眼睛的呵护。 养成好习惯必须保持一个正确的学习姿势&#xff…

redis 持久化 RDB + AOF

redis 持久化 RDB AOF 1.redis持久化----两种方式 RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09; RDB&#xff0c;简而言之&#xff0c;就是在不同的时间点&#xff0c;将redis存储的数据生成快照并存储到磁盘等介质上 AOF&am…

视频剪辑学习 pr 中视频

2023年中视频学习计划&#xff0c;学习资料全套视频。全网一手资料&#xff0c;有意者V&#xff1a; 第一章- 基础知识 第二章- 素材获取 第三章- 文案创作及搬运改写 第四章- 智能配音与自己配音修音 第五章- 剪辑基础快速入门 手机剪映零基础快速入门 电脑剪映零基础快速入门…

360SEO 360搜索引擎算法的基础知识

360搜索引擎是中国的一家互联网搜索引擎公司&#xff0c;由奇虎360公司推出。作为中国互联网领域的知名品牌之一&#xff0c;它的搜索算法一直备受关注和研究。那360搜索引擎有哪些算法的基础知识呢&#xff1f; 一、概述 360搜索引擎算法是一个非常庞大、复杂的系统&#xff…

科研人的利器:利用New Bing五分钟读完一篇论文

大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加我&#xff0c;拉你进群。 New Bing『新必应』是微软一款集成了ChatGPT的搜索引擎&#xff0c;它以聊天的方式来进行信息搜索&#xff0c;这不同过去几十年通过对话框搜索信…

Linux之yum原(三)

最近学习Linux&#xff0c;利用 yum 下载软件的时候&#xff0c;总是报错&#xff1a; 错误&#xff1a;为仓库 appstream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist因此小编决定更换一下 yum 源&#xff0c;小编用的是 CentOS8.5.2111&am…

Scala Option类型,异常处理,IO,高阶函数

Option类型 实际开发中, 在返回一些数据时, 难免会遇到空指针异常(NullPointerException), 遇到一次就处理一次相对来讲还是比较繁琐的. 在Scala中, 我们返回某些数据时&#xff0c;可以返回一个Option类型的对象来封装具体的数据&#xff0c;从而实现有效的避免空指针异常。S…

记录-对象有哪些继承方式

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 1. 原型链 温故而知新&#xff1a; 构造函数、原型和实例的关系&#xff1a;  每个构造函数都有一个原型对象&#xff0c;原型有一个属性指回构造函数&#xff0c;实例有一个内部指针指向原型。 思考…

【Java校招面试】基础知识(六)——计算机网络

目录 前言一、TCP协议 / UDP协议二、HTTP协议后记 前言 本篇主要介绍计算机网络的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第六篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回本专栏的索引文章点击这里&#xf…

Leetcode303. 区域和检索 - 数组不可变

Every day a leetcode 题目来源&#xff1a;303. 区域和检索 - 数组不可变 解法1&#xff1a;暴力 代码&#xff1a; class NumArray { public:vector<int> v;NumArray(vector<int> &nums){v nums;}int sumRange(int left, int right){int sum 0;for (in…

ChatGPT镜像网站【免费白嫖】

文章目录 前言说明网站 前言 ChatGPT是一种基于OpenAI GPT&#xff08;Generative Pretrained Transformer&#xff09;模型的聊天机器人&#xff0c;它可以对用户提出的问题做出回答&#xff0c;同时还能够进行精准的语言理解和回复&#xff0c;较好地满足了人们与机器人之间…

避免使用第三方工具完成电脑环境检测

0. 简介 在之前配置各种深度学习环境的时候经常需要先检测一下电脑的软硬件环境&#xff0c;其实整个过程比较重复和固定&#xff0c;所以我们是否有可能一键检测Python版本、PIP版本、Conda版本、CUDA版本、电脑系统、CPU核数、CPU频率、内存、硬盘等内容这是很多Deepper苦恼…