COGS 1584. [CTSC2007]挂缀

08年的论文里的方法看了半天觉得好奇怪

算法2各种看不懂。

然后发现算法1好像不用平衡树哎。

不如把算法1的动规改成贪心,然后用堆维护一下就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=200000+5;
typedef long long ll;
struct drct{
	ll c,w;
	bool operator<(const drct &rhs)const{
		return c<rhs.c;
	}
}d[N];
priority_queue<ll>q;
int main(){
	//freopen("pendant.in","r",stdin);
	//freopen("pendant.out","w",stdout);
	int n;scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&d[i].c,&d[i].w);
		d[i].c+=d[i].w;
	}
	sort(d+1,d+1+n);
	ll tot=0;
	int ans=0;
	for(int i=1;i<=n;i++)
	if(d[i].c-d[i].w>=tot)q.push(d[i].w),tot+=d[i].w,ans++;
	else if(d[i].w<q.top())tot+=d[i].w-q.top(),q.pop(),q.push(d[i].w);
	printf("%d\n%lld\n",ans,tot);
	return 0;
}


你可能感兴趣的:(COGS 1584. [CTSC2007]挂缀)