题目链接:点击打开链接
题目大意:在deadline内完成作业,要求惩罚的分数最少
题目分析:一开始的贪心,贪错了,后来想用栈+替换,结果很搓;后来参考了下人家的做法
将惩罚的分数最高的放在前面,分数相同将deadlie 小的在前面,惩罚分数小的以自己的时间为尾向前探寻,一旦有“空位”就如坐
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
using namespace std;
struct data{
int deadline;
int score;
};data info[1005];
bool visit[1005];
int cmp(data a,data b)
{
if(a.score!=b.score) return a.score>b.score;
return a.deadline<b.deadline;
}
int main()
{
int t,n,i,j,time,ans;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(visit,false,sizeof(visit));
for(i=0;i<n;i++) scanf("%d",&info[i].deadline);
for(i=0;i<n;i++) scanf("%d",&info[i].score);
ans=0;
sort(info,info+n,cmp);
for(i=0;i<n;i++)
{
time=info[i].deadline;
while(time)
{
if(!visit[time]){visit[time]=1;break;} time--;
}
if(time==0)
ans+=info[i].score;
}
printf("%d\n",ans);
}
return 0;
}