问题描述:
对于n个作业,每个作业有两个属性,一个是作业未完成的罚时,一个是作业的DDL。我们需要计算的是在n天里面,尽可能的完成作业减少罚时。
这里的贪心思想是两点:一是先处理罚时高;二是从DDL开始往前找空闲时间,这样就可以尽可能的减少影响别的作业。
代码思路是,将作业根据罚时进行降序排序;用visit[ i ]记录第i天是否已经占据了。注意寻找每个作业的处理时间的时候从ddl往前寻找
#include<stdio.h>
#include <algorithm>
using namespace std;
struct work
{
int ddl;int score;
bool operator < (const work &m)
{
return score>m.score;//降序排序
}
}job[4000];
bool visit[4000];
int main()
{
int T,N,sum,pe;
scanf("%d",&T);//T个测试用例
for(int i=0;i<T;i++)
{
sum=0;pe=0;
scanf("%d",&N);//N个作业
for(int j=0;j<N;j++)
scanf("%d",&job[j].ddl);
for(int j=0;j<N;j++)
{
scanf("%d",&job[j].score);
pe=pe+job[j].score;//总的可能扣除的分数
}
sort(job,job+N);//根据分数进行排序
for(int j=0;j<4000;j++)
visit[j]=false;
for(int j=0;j<N;j++)//处理N个作业
{
for(int k=job[j].ddl;k>0;k--)//从ddl往前面找
{
if(visit[k]==false)//还有位置
{
visit[k]=true;
sum=sum+job[j].score;//不会被扣除的分数
break;//占据一个位置后退出
}
}
}
pe=pe-sum;
printf("%d\n",pe);
}
return 0;
}