题目链接:点击打开链接
题目大意:在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;
}

本文介绍了一种通过排序和贪心策略实现的算法,用于解决在限定时间内完成多项任务并尽可能减少惩罚分数的问题。该算法首先按惩罚分数降序、截止时间升序对任务进行排序,然后采用贪心策略为每个任务分配最早可用的时间段。
1079

被折叠的 条评论
为什么被折叠?



