hdu1789(经典贪心)
题意:有t组测试数据,每组测试数据中有n门功课,第一排完成它们的时间限制,第二排是未在限制的时间内完成的要扣除的分数,然后是需要求扣的分数最少。
思路:一开始在想着用dp做,结果没有d出来,于是去看解题报告,发现可以用贪心做,但是我也没有想到思路......是这样的,对分数按从大到小排次序,然后枚举限定的时间,若是某一天没有被标记,就用这一天来完成这一门作业,若是枚举到0了,说明在限定时间内没有哪一天可以完成这门作业,那么就扣除这门课的分数......
具体看代码吧:
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; struct ss { int time,p; }t[100000]; int f[100000]; int cmp(const ss a,const ss b) { if(a.p>b.p) return 1; else if(a.p==b.p&&a.time<b.time) return 1; else return 0; } int main() { int text,n; scanf("%d",&text); while(text--) { scanf("%d",&n); memset(f,0,sizeof(f)); int i; for(i=1;i<=n;i++) scanf("%d",&t[i].time); for(i=1;i<=n;i++) scanf("%d",&t[i].p); sort(t+1,t+1+n,cmp); int sum=0; for(i=1;i<=n;i++) { for(int j=t[i].time;j>=1;j--) if(!f[j]) { f[j]=1; break; } if(j==0) sum+=t[i].p; } printf("%d\n",sum); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。