思路是贪心。
显然我们需要尽可能地先选价值大的,且为避免影响其他任务,将当前最值钱的任务拖得越晚越好。显然,如果两件任务有着相同的deadline,肯定在deadline上完成价值更大的任务,另外那件就看命吧。如果两件任务deadline不同,可以直接认为两件任务没有关系。像这样把任务分类,就可以在每个时间点上得到最优解。显然这种贪心思路是正确的。(感性理解)
具体实现,由于总时间不长,开个数组记录当前时间是否被占用。cmp将结构体数组按价值倒序排序,从价值大的往小的找,对每个任务从deadline往最开始推,找到空余时间点即记录,直至无法完成。双重循环,不会超时。
注意:找到任务放置点即退出当前任务;所有任务都要扫描一遍。
代码:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int g,d;
}cow[500000];
int tim[100000],ans;
bool cmp(node x,node y)
{
return x.g>y.g;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>cow[i].g>>cow[i].d;
sort(cow+1,cow+1+n,cmp);
for(int i=1;i<=n;i++)
for(int j=cow[i].d;j>=1;j--)
if(!tim[j])
{
tim[j]=1;
ans+=cow[i].g;
break;
}
cout<<ans;
return 0;
}