这是一道贪心类的题目。题目的大意是说Ignatius每天能够完成一项课程,然而每门课都有截止日期,如果Ignatius没能在截止日期完成的话就会扣除他相应的分数。让你求所扣除最少的分数。这道题先将截至日期从小到大排序,然后一天天的过,用一个数组来标记完成的课程,如果碰见截至日期是一样的,就将截至日期相同的扣除分数最少的和以前做过的题目中扣除分数最少的做一个比较,如果比以前少,就和以前的做个交换。就这样一直到结束。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int flag[1000];
struct sa
{
int date,grade;
}data[1007];
int cmp(const sa &a,const sa &b)
{
if(a.date==b.date)return a.grade>b.grade;
return a.date<b.date;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
memset(flag,-1,sizeof(flag));
int n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&data[i].date);
for(i=0;i<n;i++)
scanf("%d",&data[i].grade);
sort(data,data+n,cmp);
int day=1;
for(i=0;i<n;i++)
{
if(day>data[i].date)
{
int min__day=data[i].date;
int min__grade=data[i].grade;
int min=i;
for(j=0;j<i;j++)
{
if(flag[j]!=-1&&min__day>=data[j].date&&min__grade>data[j].grade)
{
min__grade=data[j].grade;
min=j;
}
}
flag[i]=flag[min];
flag[min]=-1;
}
else if(day<=data[i].date)
{
flag[i]=day;
day++;
}
}
int ans=0;
for(i=0;i<n;i++)
{
if(flag[i]==-1)
{
ans+=data[i].grade;
}
}
printf("%d\n",ans);
}
return 0;
}