题意:给你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;
}