HDU1789
//贪心,对时间按升序排序,如果时间相同则对分数按降序排序
//按时间顺序来对任务进行标记 能在今天完成则标记1,如果完成不了 则往前面找分数最小
//的进行交换,小的分数加入无法完成的分数.
#include<iostream> #include<algorithm> #include<cstring> using namespace std; struct homework { int data; int score; }; bool cmp(homework a,homework b) { if(a.data==b.data) return a.score>b.score;//假如天数一样,就比较分数大小,大的放前面 else return a.data<b.data; } int main() { int t,i,j,min; int flag[1001]; homework a[1001]; int n,sum,temp,d; while(cin>>t){ while(t--) { cin>>n; for(i=0;i<n;i++) cin>>a[i].data; for(i=0;i<n;i++) cin>>a[i].score; sum=0; sort(a,a+n,cmp);//排序 memset(flag,0,sizeof(flag)); d=1,temp=0; for(i=0;i<n;i++) { if(a[i].data>=d)//假如该天没作业,把a[i]定在该天完成 { flag[i]=1; d++; } else //假如有已经有作业了,则找出分数最小的与之交换 { min=a[i].score; temp=i;//temp为最小的分数的位置 for(j=i-1;j>=0;j--) if(flag[j]==1&&a[j].score<min) { min=a[j].score; temp=j; } sum+=a[temp].score;//sum相加 a[temp].score=a[i].score;//交换 } } cout<<sum<<endl; } } return 0; }