从一道题到贪心入门
admin
2024-04-12 15:51:03
0

今天,我们将从一道题引入贪心算法的认识.

题目

题目描述

又是一年秋季时,陶陶家的苹果树结了 n 个果子。陶陶又跑去摘苹果,这次他有一个 a 公分的椅子。当他手够不着时,他会站到椅子上再试试。

这次与 NOIp2005 普及组第一题不同的是:陶陶之前搬凳子,力气只剩下 s 了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在s<0之前最多能摘到多少个苹果。

现在已知 n个苹果到达地上的高度 x_{i},椅子的高度 a,陶陶手伸直的最大长度 b,陶陶所剩的力气 s,陶陶摘一个苹果需要的力气 y_{i},求陶陶最多能摘到多少个苹果。

输入格式

第 1 行:两个数 苹果数 n,力气 s。

第 2 行:两个数 椅子的高度 a,陶陶手伸直的最大长度 b。

第 3 行~第 3+n−1 行:每行两个数 苹果高度 x_{i},摘这个苹果需要的力气y_{i}。 

输出格式

只有一个整数,表示陶陶最多能摘到的苹果数。

输入输出样例

输入:

8 15
20 130
120 3
150 2
110 7
180 1
50 8
200 0
140 3
120 2

输出:

4

要想知道详细题目,详见陶陶摘苹果(升级版) - 洛谷 

梳理题目:

我们现在先重新梳理一下题目中数据:

的n表示着树上苹果的总和数,s表示陶陶搬凳子时候还剩下的力气.

a表示凳子的高度,b表示陶陶伸出手臂的最大长度.

接下来的x_{i}表示每一个苹果的高度,y_{i}表示陶陶摘每一个苹果所花的力气.

代码思路:

首先由于要输入每一个苹果的高度和陶陶摘这个苹果所要消耗的力气,我打算用一个结构体来储存数据:

struct apple{int a_long,s_long;
}a[MAX],b[MAX];

 在这个结构体中,a_long是每一个苹果距离地面的高度,s_long表示摘每一个苹果要花的力气.(怪鄙人英语不好).接着,a数组用来输入,b数组用来储存当陶陶伸出手臂的最大值时能摘到苹果.

接下来,我定义了一下的变量

int n,s,chair,arm,sum=0,j=1,cnt=0, a_long, s_long;

 简单说明一下:

n,s,chair,arm,这四个变量前面的说了的,就不必详细的赘述了.

sum用来统计陶陶消耗的力量值,j用来计算有多少个苹果刚好能被陶陶摘到.

cnt用来计数最终在力量消耗完之前所能摘到的苹果个数.

a_long和s_long在冒泡排序里边做为一个交换的媒介.

接下来的输入就不用多说了.

cin>>n>>s>>chair>>arm;
for(int i=1;i<=n;i++){cin>>a[i].a_long>>a[i].s_long;
}

接下来我们要进行关键的一步––筛选.

我们要把陶陶能够摘到的苹果储存在b数组里.前提是这个苹果的高度要小于等于板凳的高度加上陶陶伸长手臂能达到的最大值

接着就有了一下的判断

if(a[i].a_long<=chair+arm){b[j].a_long=a[i].a_long;b[j].s_long=a[i].s_long;
}

别急,还没完,外面还有一层循环:

for(int i=1;i<=n;i++){if(a[i].a_long<=chair+arm){b[j].a_long=a[i].a_long;b[j].s_long=a[i].s_long;j++;}
}

接下来的一步,十分重要.

我们要把已经筛选出来的数据,重新排一下序.用什么顺序排序呢?当然是以每个苹果消耗力量的值以升序排序,更利于我们下一步的计算.

在这里,我用的是冒泡排序(sort当时突然一时想不起来了)

下面是冒泡排序里面的交换程序,要想知道冒泡排序的详细解法,详见排序算法(冒泡,桶排序,选择,sort)_cyy_yyds(蒟蒻练习生)的博客-CSDN博客

a_long=b[k].a_long;
s_long=b[k].s_long;
b[k].a_long=b[k+1].a_long;
b[k].s_long=b[k+1].s_long;
b[k+1].a_long=a_long;
b[k+1].s_long=s_long;

 当然,这里面也可以用swap函数

 接下来亮出整个冒泡的代码

​
for(int i=1;ib[k+1].s_long){//swap(b[k].s_long,b[k+1].s_long);//swap(b[k].a_long,b[k+1].a_long);a_long=b[k].a_long;s_long=b[k].s_long;b[k].a_long=b[k+1].a_long;b[k].s_long=b[k+1].s_long;b[k+1].a_long=a_long;b[k+1].s_long=s_long;}}
}​

重头戏来了,来到了本讲最重要的地方––贪心算法.

要学会写代码,先要知道贪心是什么:

贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解(源自于百度百科)

明白了贪心的含义,接下来我们来梳理一下本题如何使用贪心算法

首先,你要满足sum(目前消耗掉的力量)

进入循环后,cnt++,表示摘了一个苹果,然后用sum加上摘这个苹果所消耗的力量值.随后下标+1,可以得到以下代码 

while(sum

可是接下来我们运行后会发现,加入树上的苹果已经摘完了,可是所消耗的力量值尚未达到上限时,它还会继续循环,并不会退出循环

所以我们应该加上一个条件

while((sum

接下来输出

if(sum>s) cout<

本道题目讲解完毕,奉上最终代码(注:有些注释是我用来测试的,这道题我测试了好就才AC)

#include
#define MAX 0xffff//65535
using namespace std;
struct node{int a_long,s_long;
}a[MAX],b[MAX];
//结构体,b数组储存的是苹果的高度正好在淘淘的手臂长和凳子高之内的数
int n,s,chair,arm,sum=0,j=1,cnt=0, a_long, s_long;
//chair是凳子的高度,arm是手臂的长度
//sum用来统计力气是否用完,cnt用来计数能摘到多少果子
int main(){cin>>n>>s>>chair>>arm;for(int i=1;i<=n;i++)cin>>a[i].a_long>>a[i].s_long;//输入结构体a_long表示高度,s_long表示力气for(int i=1;i<=n;i++){if(a[i].a_long<=chair+arm){b[j].a_long=a[i].a_long;b[j].s_long=a[i].s_long;j++;}}//用来统计恰好能摸到的果子,储存在b数组里//cout<<"b data:\n";//for(int i=1;ib[k+1].s_long){//swap(b[k].s_long,b[k+1].s_long);//swap(b[k].a_long,b[k+1].a_long);a_long=b[k].a_long;s_long=b[k].s_long;b[k].a_long=b[k+1].a_long;b[k].s_long=b[k+1].s_long;b[k+1].a_long=a_long;b[k+1].s_long=s_long;}}}//冒泡排序,排的是每一个果子所需要的力气,升序//cout<<"after swap:\n";//for(int i=1;i<=j;i++){//cout<s) cout<

相关内容

热门资讯

4家银行AIC现身存储巨头股东... 近日,资本市场热度颇高的两家存储巨头长鑫科技集团股份有限公司(以下简称“长鑫科技”)、长江存储控股股...
8元无限续杯、0元看电影、老字... 城市的烟火暖意,藏在亲民的消费场景里,也藏在老地标的新生蜕变中。粤汉码头火车旁新开竹林茶馆,8元就能...
2026年水利工程新趋势,这些... 随着全球气候变化和城市化进程的加速,水利工程在保障水资源供给、改善生态环境以及提升人民生活质量中的作...
原创 发... 这几年,身边越来越多人开始换一种活法:不急着买房,不执着“上车”,反而愿意把钱拿去租一套更舒服、更体...
小红书入场Skill分发,B站... 来源:界面新闻 文丨AI价值官 星野 编辑丨美圻 过去半年,Skill 这个词在AI圈的出现...
2026年福州企业门户网站建设... 本篇将回答的核心问题 在数字化转型加速的2026年,企业门户网站建设应遵循哪些核心评估标准,以确保投...
原创 今... 今日金价:2026年5月22日注意了!黄金或现历史类似回调走势 5月22日,金市又热闹起来了,咱们看...
雷军发布YU7 GT、YU7标... 5月21日,小米人车家全生态新品发布会在北京举办,小米集团创始人、董事长兼CEO雷军正式发布小米YU...
留神峪煤矿瓦斯爆炸事故发布会:... 昨晚,山西留神峪煤矿发生瓦斯爆炸,造成重大人员伤亡。今天,当地召开新闻发布会,现场全体默哀。会上介绍...
原创 修... 修复资产负债表,日本花了几十年。 自上世纪90年代初泡沫经济破裂后,日本陷入了长达三十年的通缩螺...
2026年小红书效果化种草白皮... 2026 年小红书正式迈入种草效果化时代,这是品牌追求预算确定性回报与平台升级为消费决策、用户信任场...
连续18年获“全国文化企业30... 南都讯 记者钟欣5月21日,第二十二届中国(深圳)国际文化产业博览交易会开幕。展会期间,光明日报社和...
荣耀确认IPO未终止!开放员工... 5月22日,荣耀因股改满一年未完成IPO,按约定正式开放员工持股退出通道。据《财闻》报道称,当日16...
易方达蓝筹精选有新变动:增聘2... 《每日经济新闻》记者获悉,继景顺长城、中欧等多家基金公司旗下百亿基金经理产品调整后,易方达基金也迎来...
光储龙头,又翻倍了 去年海外光储赛道最受关注的公司,毫无疑问是阳光电源,市值重回巅峰,风光无限。 但今年一季度业绩突然失...
中企出海报告在静安发布,七成受... 来源:滚动播报 (来源:上观新闻) 昨天,在上海静安举办的澳洲会计师公会出海论坛暨澳洲注册会计师颁...
京蒙协作延链强链 科右中旗牛产... 初夏时节,走进内蒙古华阳牛业科技集团有限公司屠宰加工车间,自动化生产线高效运转。作为京蒙协作产业帮扶...
原创 中... 最近发布了一份有关新一线城市魅力的榜单。榜单按照商业资源聚集度、城市枢纽性、城市人活跃度这五个方面来...
突然,全线跳水!超16万人爆仓 来源:宁波晚报 5月23日,被视作反映市场风险偏好指标的加密货币持续跳水。 截至发稿,比特币大跌3....
基民懵了!说好的科技行情,结果... 每经记者:叶峰 每经编辑:赵云 本周股指冲高回落,沪深两市股票型ETF和跨境型ETF合计净流出729...