题目大意:一个同学完成老师布置的作业。每个作业都有一个期限和对应的扣分。在截止日没有完成,则会扣相应的分。问:如何安排做作业的顺序,才能使扣的总分最少(完成一个作业需要1天)
思路:根据贪心的思想,优先考虑扣分多的作业,先处理它们。
具体做法,将作业以扣分多少降序排序。从扣分最多的作业开始,将它安排在它的截止日期那一天完成,若那天已经被占用了,则往前移一天,如果前面的天数都被占用了,则这个作业只能放弃,必须要被扣分.
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct node
{
int deadline;
int score;
}a[1002];
int IsDone[2000];
bool cmp(node a,node b)
{
return a.score>b.score;
}
int main()
{
int Case,n;
cin>>Case;
while(Case--)
{
memset(IsDone,0,sizeof(IsDone));
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].deadline;
for(int i=1;i<=n;i++)
cin>>a[i].score;
sort(a+1,a+n+1,cmp);
int sum=0;
for(int i=1;i<=n;i++)
{
int flag=0;
for(int j=a[i].deadline;j>=1;j--)
{
if(!IsDone[j])
{
IsDone[j]=1;
flag=1;
break;
}
}
if(!flag)
sum+=a[i].score;
}
cout<<sum<<endl;
}
return 0;
}