基础算法——贪心
上次讲了进阶sort与重载运算符,上题:
题目描述:
输入n个学生的姓名、学号、成绩,查询其中m名同学的成绩。
输入描述:
第一行一个正整数n,表示有n名同学。
接下来n行,每行为一名同学的姓名、学号、成绩。
接下来一行一个正整数m,表示查询其中m名同学的成绩。
接下来一行,有m个正整数,中间用空格隔开,对于第i个数mi,表示排名第mi的同学的成绩。成绩越高的同学排名越靠前,如果两名同学成绩相同,学号小的同学成绩靠前。
输出描述:
m行,每行输出排名第mi的同学的姓名、学号、成绩,中间用空格隔开。
输入样例:
3
Galon 20161103 100
Bruce 20161105 10
Dijkstra 20161102 30
1
2
输出样例:
Dijkstra 20161102 30
其他说明:
名字不超过10个字符,0<m<n<10000,所有数据均在int范围内。
RFdragon的英文名叫Galon
今天来讲一下贪心。所谓贪心,就是怎么贪怎么来,所有场攻全走脸(hearthstone),哪种棋子多买哪种(autochess),一套卡组带八张传奇(COR)……大家听完我的描述之后,觉得贪心实在是太废物了,我们还是不学了吧。但是等一下,贪心虽然废物,但有些题确实要用贪心的思想来做。比如下面的一道题:
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。题目描述: 学生节到了,RFdragon要在学校的会议室举办n个活动,但由于时间有冲突,不得不取消其中一部分活动。给出n各个活动的起始和终止时间,求出最多能排多少个活动。由于RFdragon十分勤劳能干,活动的准备时间几乎为0,也就是说一个活动结束后可以立即举办下一个活动。 输入描述: 第一行一个正整数n,表示有n个打算举办的活动。 接下来n行,每行两个正整数,分别表示一个活动的起始和终止时间。 输出描述: 一行一个正整数,表示最多能举办的活动数。 输入样例: 3 1 4 2 3 3 4 输出样例: 2 其他说明: n<10000,所有数据均在int范围内。
这时,我们就可以来贪一贪。c++中的贪心指的是:在解决问题是,做出当前最好的选择,也就是说,不考虑整体,而只考虑局部最优解。看看对贪心的描述,好像根本得不到这道题的最优解。其实,这道题是一道经典的贪心题,完全能用贪心做出来,关键看你怎么贪。我们要贪的是结束时间,也就是每次找出结束时间最早的活动,优先选择它。代码如下:
#include<algorithm> #include<cstdio> using namespace std; struct acti { int start,end; bool operator<(const acti x)const { return end<x.end; } }a[10000]; int n,cur,ans; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d %d",&a[i].start,&a[i].end); sort(a+1,a+1+n); for(int i=1;i<=n;i++) if(a[i].start>=cur) { ans++; cur=a[i].end; } printf("%d",ans); return 0; }
这就是贪心算法的精髓——选择一个不会影响结果的标准对所有可能选项进行排序,优先选择排在前面的选项。
这就是贪心的用法,你学会了吗?
//答案代码
#include<algorithm> #include<cstdio> using namespace std; struct student { char name[10]; int num,score; bool operator<(const student x)const { if(score>x.score) return 1; if(score<x.score) return 0; return num>x.num; } }stu[10000]; int n,m,a[10000]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%s %d %d",&stu[i].name,&stu[i].num,&stu[i].score); sort(a+1,a+1+n); scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%d",&a[i]); for(int i=i;i<=m;i++) printf("%s %d %d\n",stu[a[i]].name,stu[a[i]].num,stu[a[i]].score); return 0; }
Created by RFdragon

更多精彩