标签:
★★ 输入文件:pendant.in 输出文件:pendant.out 简单对比
时间限制:1 s 内存限制:256 MB
【题目描述】
题解:
十分智慧的贪心。。
第一眼就想到是要双关键字排序,推导一下可以发现,只要将C与W的加和排序即可,然后用一个大根堆维护一下即可(我比较懒。。直接用的STL。。)
Code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define N 200010
using namespace std;
struct point{
long long c,w,s;
}a[N];
priority_queue<int> q;
long long n,sum,ans;
long long in(){
long long x=0; char ch=getchar();
while (ch<‘0‘ || ch>‘9‘) ch=getchar();
while (ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
return x;
}
bool cmp(point x,point y){
return x.s<y.s;
}
int main(){
n=in();
for (int i=1; i<=n; i++){
a[i].c=in(),a[i].w=in();
a[i].s=a[i].c+a[i].w;
}
sort(a+1,a+n+1,cmp);
sum=0,ans=0;
for (int i=1; i<=n; i++){
if (sum<=a[i].c)
q.push(a[i].w),sum+=a[i].w,ans++;
else {
int top=q.top();
if (sum<=(a[i].c+top) && top>a[i].w)
sum+=(a[i].w-top),q.pop(),q.push(a[i].w);
}
}
printf("%lld\n%lld\n",ans,sum);
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/morestep/article/details/46776153