http://acm.hdu.edu.cn/showproblem.php?pid=1789;
这个题目就是用贪心的思想来做,首先按分数从高到底排下序,然后在判断哪几个不能完成时用到了一个小技巧。
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; #define maxn 10005 struct ke { int day; int score; }s[maxn]; bool cmp(ke a,ke b){ if(a.score>b.score) return true; return false; } int main() { int N; scanf("%d",&N); while(N--){ int m; scanf("%d",&m); for(int i=0;i<m;i++){ scanf("%d",&s[i].day); } for(int i=0;i<m;i++){ scanf("%d",&s[i].score); } sort(s,s+m,cmp); int flag[maxn]={0};///初始化 相当于memset(flag,0,sizeof(flag)); int ans=0,t; for(int i=0;i<m;i++){ t=s[i].day; while(flag[t]) { ///在此处用到了一个小技巧,flag[3]=1表示第三天已被占用时,当t=3时,t--,判断flag[2],...依次判断,当flag[2],flag[1]都=1时, t--; ///说明这些天已被占用,所以s[i].day这一天的分数要被罚掉。 } if(t<=0) ans+=s[i].score; else flag[t]=1; } printf("%d\n",ans); } return 0; }