关闭

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

430人阅读 评论(0) 收藏 举报
分类:

1584. [CTSC2007]挂缀

★★   输入文件: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;
}
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:57480次
    • 积分:1534
    • 等级:
    • 排名:千里之外
    • 原创:89篇
    • 转载:0篇
    • 译文:0篇
    • 评论:12条
    最新评论