贪心算法部分习题及代码

  • 1 装箱问题
  • 2 月饼
  • 3 最优合并问题
  • 4 看电影
  • 5 喷水装置
  • 6 活动选择问题

1 装箱问题

假设有N项物品,大小分别为s​1​​、s​2​​、…、s​i​​、…、s​N​​,其中s​i​​为满足1≤s​i​​≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。
输入格式:
输入第一行给出物品个数N(≤1000);第二行给出N个正整数s​i​​(1≤s​i​​≤100,表示第i项物品的大小)。
输出格式:
按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。
输入样例:
8
60 70 80 90 30 40 10 20
输出样例:
60 1
70 2
80 3
90 4
30 1
40 5
10 1
20 2
5
源代码:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{int n,i,j,xs;xs=0;int *a,*b,*c;cin>>n;a=(int*)malloc(sizeof(int)*n);//a数组为存放输入物品的大小和数量b=(int*)malloc(sizeof(int)*n);//b数组为现有箱子的数量c=(int*)malloc(sizeof(int)*n);//c数组为第i个物品所放在箱子的号码for(i=0;i<n;i++){cin>>a[i];b[i]=100;}for(i=0;i<n;i++)for(j=0;j<n;j++)if(a[i]<=b[j]){b[j]=b[j]-a[i];c[i]=j+1;break; }for(i=0;i<n;i++)if(b[i]<100)xs++;for(i=0;i<n;i++)cout<<a[i]<<" "<<c[i]<<endl;cout<<xs<<endl;return 0;
}

2 月饼

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入格式:
每个输入包含一个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N 表示月饼的种类数、以及不超过 500(以万吨为单位)的正整数 D 表示市场最大需求量。随后一行给出 N 个正数表示每种月饼的库存量(以万吨为单位);最后一行给出 N 个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后 2 位。
输入样例:
3 20
18 15 10
75 72 45
输出样例:
94.50
源代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{int zl,xql,i,l,j;l=0;j=0;double sum,s;sum=0;double *a,*b,*dj;cin>>zl;cin>>xql;a=(double*)malloc(sizeof(double)*zl);//每种月饼的库存量b=(double*)malloc(sizeof(double)*zl);//每种月饼的总售价dj=(double*)malloc(sizeof(double)*zl);//每种月饼的单价for(i=0;i<zl;i++)cin>>a[i];for(i=0;i<zl;i++)cin>>b[i];for(i=0;i<zl;i++)dj[i]=b[i]/a[i];while(xql!=0){s=0;for(i=0;i<zl;i++)if(s<dj[i]){s=dj[i];l=i;}if(a[l]<=xql){sum=sum+b[l];xql=xql-a[l];dj[l]=0;j++;}else{sum=sum+xql*dj[l];xql=0;}if(j==zl)break;}cout<<setiosflags(ios::fixed)<<setprecision(2)<<sum<<endl;return 0;
}

3 最优合并问题

题目来源:王晓东《算法设计与分析》
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。
假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设
计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。
为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
输入格式:
第一行有 1 个正整数k,表示有 k个待合并序列。
第二行有 k个正整数,表示 k个待合并序列的长度。
输出格式:
输出最多比较次数和最少比较次数。
输入样例:
在这里给出一组输入。例如:
4
5 12 11 2
输出样例:
在这里给出相应的输出。例如:
78 52
源代码:

#include <iostream>
#include <algorithm>
using namespace std;
bool map(int a,int b)
{return a>b;
}
int main()
{int n,i,sum1,sum2;int *k1,*k2;cin>>n;k1=(int *)malloc(sizeof(int)*n);k2=(int *)malloc(sizeof(int)*n);for(i=0;i<n;i++){cin>>k1[i];k2[i]=k1[i];}sort(k1,k1+n);sort(k2,k2+n,map);sum1=sum2=0;for(i=0;i<n-1;i++){k1[i+1]=k1[i]+k1[i+1];sum1+=k1[i+1];sort(k1+i+1,k1+n);k2[i+1]=k2[i]+k2[i+1];sum2+=k2[i+1];sort(k2+i+1,k2+n,map);}sum1=sum1-(n-1);sum2=sum2-(n-1);cout<<sum2<<" "<<sum1<<endl;return 0;
}

4 看电影

终于到周末了,明明是特别喜欢看电影。他想在一天内尽量多的看到完整的多部电影。
现在他把他喜欢的电影的播放时间表给你,希望你能帮他合理安排。
输入格式:
输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示明明喜欢的电影的总数。
接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个电影的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。
当n=0时,输入结束。
输出格式:
对于每组输入,输出能完整看到的电影的个数。
输入样例:
在这里给出一组输入。例如:
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
输出样例:
在这里给出相应的输出。例如:
5
源代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
struct ab{int s;int f;
};
int cmp(ab a,ab b)
{return a.f<b.f;
}
int main()
{int n,i;ab x[110];while(~scanf("%d",&n)){if(n==0){break;}for(i=0;i<n;i++){scanf("%d %d",&x[i].s,&x[i].f);}sort(x,x+n,cmp);int sum=1;int fina=x[0].f;for(i=1;i<n;i++){if(x[i].s>=fina){sum++;fina=x[i].f;}}printf("%d\n",sum);}return 0;
}

5 喷水装置

长L米,宽W米的草坪里装有n个浇灌喷头。每个喷头都装在草坪中心线上(离两边各W/2米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。
请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?
输入格式:
输入包含若干组测试数据。
第一行一个整数T表示数据组数。
每组数据的第一行是整数n、L和W的值,其中n≤10 000。
接下来的n行,每行包含两个整数,给出一个喷头的位置和浇灌半径。
如图1所示的示意图是样例输入的第一组数据所描述的情况。

输出格式:
对每组测试数据输出一个数字,表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开还不能浇灌整块草坪,则输出-1。
输入样例:
3
8 20 2
5 3
4 1
1 2
7 2
10 2
13 3
16 2
19 4
3 10 1
3 5
9 3
6 1
3 10 1
5 3
1 1
9 1
输出样例:
6
2
-1
数据范围与提示:
对于100%的数据,n≤15000。
源代码:

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
struct SEG
{double x,y;
}a[20005];
bool cmp(const SEG& x,const SEG& y)
{return x.x<y.x;
}
void Read()
{cin>>n>>L>>h;cnt = 0;for(int i = 1;i <= n;i++){cin>>x>>r;if(r <= h/2)continue;cnt ++;a[cnt].x = x - sqrt(r*r - h*h/4.0);a[cnt].y = x + sqrt(r*r - h*h/4.0);}
}
void solve()
{double t= 0;int ans = 0,bj = 1,i = 1;while(t < L){ans ++;double s = t;for(;a[i].x <= s && i<= cnt;i++)if(t < a[i].y)t = a[i].y;if(t == s && s < L){cout<<-1<<endl;bj = 0;break;}}if(bj)cout<<ans<<endl;
}
int main()
{ios::sync_with_stdio(false);int T;cin>>T;while(T--){Read();sort(a+1,a+cnt+1,cmp);solve();}return 0;
}

6 活动选择问题

假定一个有n个活动(activity)的集合S={a1a_{1}a​1​​,a2a_{2}a​2​​,…,ana_{n}a​n​​},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动aia_{i}a​i​​都有一个开始时间sis_{i}s​i​​和一个结束时间fif_{i}f​i​​,其中0<=si<fi<=327670<=s_{i}<f_{i}<=327670<=s​i​​<f​i​​<=32767。如果被选中,任务aia_{i}a​i​​发生在半开时间区间[si,fi)[s_{i},f_{i})[s​i​​,f​i​​)期间。如果两个活动aia_{i}a​i​​和aja_{j}a​j​​满足[si,fi)[s_{i},f_{i})[s​i​​,f​i​​)和[sj,fj)[s_{j},f_{j})[s​j​​,f​j​​)不重叠,则称它们是兼容的。也就说,若si>=fjs_{i}>=f_{j}s​i​​>=f​j​​或sj>=fis_{j}>=f_{i}s​j​​>=f​i​​,则aia_{i}a​i​​和aja_{j}a​j​​是兼容的。在活动选择问题中,我们希望选出一个最大兼容活动集。
输入格式:
第一行一个整数n(n≤1000);接下来的n行,每行两个整数,第一个sis_{i}s​i​​,第二个是fif_{i}f​i​​(0<=si<fi<=327670<=s_{i}<f_{i}<=327670<=s​i​​<f​i​​<=32767)。
输出格式:
输出最多能安排的活动个数。
输入样例:
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
输出样例:
4
样例解释:
安排的4个活动为1 4, 5 7, 8 11和12 14。
源代码:
代码与第4题看电影的源代码一致。但需要把结构体数组x的范围加大。

2020-11-23 PTA算法_贪心算法部分习题及代码相关推荐

  1. java调度问题的贪心算法_贪心算法——换酒问题

    知识回顾 贪心算法 (greedy algorithm),又称贪婪算法. 是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法. 贪心算法在 有最优子 ...

  2. prim算法_贪心算法详解(附例题)

    贪心算法的特征规律 贪心算法,"贪心"二字顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的"局部& ...

  3. java排队算法_贪心算法-排队问题-JAVA

    自己最近在学一些算法,试着把网上的贪心算法的例题编出来,JAVA版. [题目描述] 在一个医院B 超室,有n个人要做不同身体部位的B超,已知每个人需要处理的时间为ti,(0 输入数据:第1行一个正整数 ...

  4. 田忌赛马贪心算法_贪心算法之田忌赛马

    你一定听过田忌赛马的故事吧?       如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以得到200两银子,输一局,田忌就要输掉20 ...

  5. 田忌赛马贪心算法_贪心算法--田忌赛马问题

    题目描述: 你一定听过田忌赛马的故事吧? 如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛.赢一局,田忌可以得到200两银子,输一局,田忌就要输掉20 ...

  6. 田忌赛马贪心算法_贪心算法解决田忌赛马

    田忌赛马--对策问题 教学目标: 1.通过简单的事例,使学生初步体会对策论在解决... 梁锦美有无课件 上课时间 有 12 月 15 日 1 田忌赛马中的数学问题 课时... 同学们,你听过" ...

  7. 常用十大算法_回溯算法

    回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...

  8. 双“11”搞促销?用贪心算法来盘他!

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 这几年商家为了刺激消费是变着花样的推出各种各样的活动,以某多多为首的运营式电商更是 ...

  9. 双“11”搞促销?用贪心算法盘它

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 头图 |  CSDN 下载自东方IC 这几年商家为了刺激消费是变着花样的推出各种各样的活动,以某多多为首的运营式电商更是让我们看 ...

最新文章

  1. darknet53的网络结构笔记
  2. 对微软Web Deploy的一次艰难调试
  3. Mysql 安装服务无法启动解决方案与使用的一般使用指令
  4. tf.expand_dims 来增加维度
  5. python里的resize_利用python之wxpy模块玩转微信!这部小儿科吗!
  6. SilverLight显示中文字(一)
  7. python mvc_python mvc设计模式(一)
  8. C# 委托与事件总结
  9. Android版MrHuo工作室客户端开发心得(二)
  10. 单例模式(含多线程处理)
  11. linux命令行用户登录,Linux终端以及用户登录相关命令
  12. Visio中如何绘制斜线箭头
  13. 访问网站时出现Service Unavailable的解决方法
  14. 京东商城登录逻辑分析,实现程序登录京东商城
  15. 同人游戏开发工具巡礼——AVG(ADV)引擎篇
  16. STM32中使用MMA7660重力加速度传感器
  17. 树莓派WiFi设置固定IP地址
  18. 预充电电路工作原理_预充电阻和预充继电器的工作原理和功用是什么?
  19. 微量小程序联盟,如何实现微信小程序换量和微信小程序推广?
  20. LaTeX常用数学符号表示方法

热门文章

  1. yolov5 训练crowded human 【visible body detection】
  2. 在下列用户中什么管理计算机的权限最小,计算机网络管理员考试试题和答案
  3. 百度研究院发布2022科技趋势预测,涵盖三大层面、十大领域
  4. 01章 象数易理篇之一
  5. FlexboxLayout全攻略(Google官方灵活实现流式布局控件)
  6. 21世纪东方美女标准[男士参考女士学习]
  7. 客户一个无厘头的BUG ,让我的青春痘炸了2颗
  8. Your PHP version does not satisfy that requirement
  9. 所见即所得——小程序可视化开发
  10. CAD室内设计构思怎么写?