zznu-2095 我只看看不写题

[题目链接]

思路:时间点1可以删除任意一个软件记录,时间点i只可以删除结束时间≥i的软件记录。大的时间选择删除记录不会影响小的时间。所以按时间点从大到小依次贪心选取最优即可。 //一开始就想到了,为啥没写出来 zz zz zz zz zz
代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int Max_n=1e5+10;

int t,n,m;
struct Node{
    int e,f;
    bool operator<(const Node&n)const{
        return f>n.f;
    }
}node[Max_n];

int main()
{
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        ll ans=0,sum=0;
        for(int i=0;i<n;i++){
            scanf("%d%d",&node[i].e,&node[i].f);
            ans+=node[i].e;
        }
        sort(node,node+n);
        int k=0;
        priority_queue<int,vector<int>,less<int> >que;
        for(int i=m;i>=1;i--){
            while(k<n&&node[k].f>=i)que.push(node[k++].e);
            if(!que.empty()){
                sum+=que.top();
                que.pop();
            }
        }
        printf("%lld\n",ans-sum);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zzti_xiaowei/article/details/80326023