题意:有t组测试数据,每组测试数据中有n门功课,第一排完成它们的时间限制,第二排是未在限制的时间内完成的要扣除的分数,然后是需要求扣的分数最少。
思路:一开始在想着用dp做,结果没有d出来,于是去看解题报告,发现可以用贪心做,但是我也没有想到思路......是这样的,对分数按从大到小排次序,然后枚举限定的时间,若是某一天没有被标记,就用这一天来完成这一门作业,若是枚举到0了,说明在限定时间内没有哪一天可以完成这门作业,那么就扣除这门课的分数......
具体看代码吧:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct ss
{
int time,p;
}t[100000];
int f[100000];
int cmp(const ss a,const ss b)
{
if(a.p>b.p)
return 1;
else if(a.p==b.p&&a.time<b.time)
return 1;
else
return 0;
}
int main()
{
int text,n;
scanf("%d",&text);
while(text--)
{
scanf("%d",&n);
memset(f,0,sizeof(f));
int i;
for(i=1;i<=n;i++)
scanf("%d",&t[i].time);
for(i=1;i<=n;i++)
scanf("%d",&t[i].p);
sort(t+1,t+1+n,cmp);
int sum=0;
for(i=1;i<=n;i++)
{
for(int j=t[i].time;j>=1;j--)
if(!f[j])
{
f[j]=1;
break;
}
if(j==0)
sum+=t[i].p;
}
printf("%d\n",sum);
}
return 0;
}