题意:给你N道作业的最后完成的天数和如果没完成的话,需要扣的分数,然你求解为了,扣最少的分数,你应该如何安排你的作业流程
思路:贪心,我们可以按照分数的权重进行排序,如果一样,那么按照时间从小到大排序
然后先完成权重最的作业,如果产生了冲突,只能扣分了。
#include<iostream> #include<cstdio> #include<string.h> #include<algorithm> using namespace std; struct node { int h; int w; } Node[1111]; int T,m,n; int vis[1111]; int cmp(node a,node b) { if(a.w!=b.w) { return a.w>b.w; } return a.h<b.h; } int main() { int ans; scanf("%d",&T); while(T--) { ans=0; scanf("%d",&n); memset(vis,0,sizeof(vis)); memset(Node,0,sizeof(Node)); for(int i=1; i<=n; i++) { scanf("%d",&Node[i].h); } for(int i=1; i<=n; i++) { scanf("%d",&Node[i].w); } int step=0; sort(Node+1,Node+n+1,cmp); for(int i=1; i<=n; i++) { step=0; for(int j=Node[i].h; j>0; j--) { if(!vis[j]) { vis[j]=1; step=1; break; } } if(step==0) ans+=Node[i].w; } printf("%d\n",ans); } return 0; }