题解 P5909 【[CTSC2007]挂缀pendant】
这是一道比较经典的反悔贪心。原来CTSC还有这样的水题。
什么是反悔贪心呢?用通俗的话讲,由于贪心只注重当前的最优解,有时候无法得到全局最优解。反悔贪心就是在发现比当前最优解还要优时进行反悔操作。
看到这道题,题意大致可以理解为:给你
这里我们不妨定义一个数组
我们不妨设
说了一堆,反悔在哪呢,就是在取出长度为
最大值可以用堆来维护。
贴上代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+2;
#define int long long
struct interval{
int len,r;
bool operator <(const interval & x)const{
return r<x.r;
}
}a[MAXN];
int f[MAXN];
int n,num,sum;
priority_queue<int>qu;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].r>>a[i].len;
a[i].r+=a[i].len;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
if(sum+a[i].len<=a[i].r){
num++;
sum+=a[i].len;
qu.push(a[i].len);
}
else if(qu.top()>a[i].len){
sum-=qu.top();
qu.pop();
qu.push(a[i].len);
sum+=a[i].len;
}
}
cout<<num<<endl<<sum<<endl;
return 0;
}