题解 SP18965

思路是贪心。

显然我们需要尽可能地先选价值大的,且为避免影响其他任务,将当前最值钱的任务拖得越晚越好。显然,如果两件任务有着相同的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;
}

猜你喜欢

转载自www.cnblogs.com/s-t-a-r-d-u-s-t/p/11436836.html