思路:
时间点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;
}