3 3 3 3 3 10 5 1 3 1 3 1 6 2 3 7 1 4 6 4 2 4 3 3 2 1 7 6 5 4
0 3 5
贪心,但是要有些修正。
先按日期从小到大排序,日期相同的按分数从大到小排序。
但这样的排序是有问题的,在计算中还需要修正。
从头处理,判断当前作业能不能完成,用标记数组表示第i个作业在哪天完成。
如果能完成,day++。
如果不能完成,判断在此前是否存在分数小于当前作业的作业,存在则不完成之前的换成完成当前的。(数据可能弱了,不需要判断之前分数最小的作业完成的时候是否在当前作业必须完成作业日期之前)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int flag[1005]; struct node { int deadline,reduce; }num[1005]; bool cmp(const struct node &a,const struct node &b) { return a.deadline!=b.deadline?(a.deadline<b.deadline):(a.reduce>b.reduce); } int main() { int T,n; scanf("%d",&T); for(;T--;) { scanf("%d",&n); memset(flag,-1,sizeof(flag)); for(int i=0;i<n;++i) scanf("%d",&num[i].deadline); for(int i=0;i<n;++i) scanf("%d",&num[i].reduce); sort(num,num+n,cmp); int day=0,minn,xi,maxx=0; for(int i=0;i<n;++i) { if(day<num[i].deadline) { flag[i]=day; day++; } else { minn=(1<<30)-1; for(int j=0;j<i;++j) { if(flag[j]!=-1&&flag[j]<num[j].deadline&&minn>num[j].reduce) { minn=num[j].reduce; xi=j; } } if(minn<num[i].reduce) { flag[i]=flag[xi]; flag[xi]=-1; maxx+=num[xi].reduce; } else maxx+=num[i].reduce; } } printf("%d\n",maxx); } return 0; }来源: http://blog.csdn.net/acm_ted/article/details/7772145