【贪心】【CTSC2007】【cogs1584】挂缀

1584. [CTSC2007]挂缀

★★   输入文件:pendant.in   输出文件:pendant.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】
【贪心】【CTSC2007】【cogs1584】挂缀_第1张图片
【贪心】【CTSC2007】【cogs1584】挂缀_第2张图片
【贪心】【CTSC2007】【cogs1584】挂缀_第3张图片

题解:
十分智慧的贪心。。
第一眼就想到是要双关键字排序,推导一下可以发现,只要将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;
}

你可能感兴趣的:(【贪心】【CTSC2007】【cogs1584】挂缀)