挂缀codevs2382

来源:互联网 发布:l36h刷机软件 编辑:程序博客网 时间:2024/06/06 01:26

题目描述 Description

“珠缀花蕊,人间几多酸泪”……
挂缀在很早就被人们作为一种装饰品,垂坠的风韵,华丽摇曳的摆动,展现出一种与众不同的优雅与高贵。而我们的主人公小Q,正想买一条漂亮的挂缀放在寝室里作为装饰。
挂坠的构成,是由若干粒缀珠相互连接而成。每一个缀珠由三部分组成:分别是珠子、珠子上方的连接环与珠子下方的挂钩(如下图) 。我们可以简单的认为从上往下数的第 i 个缀珠是将它的连接环套在其上方(也就是第 i-1 个)缀珠的挂钩之上(第一个除外) 。小 Q想买一根足够长的挂缀,这样显得更有韵味☺

然而商店的老板告诉小Q,挂缀是不可能做到任意长的,因为每一个珠子都受到重力作用,对其上方的挂钩有一定的拉力,而挂钩的承受能力是有限的。老板还告诉小 Q,他一共拥有 N 个珠缀(假设每一个珠缀都很漂亮,小 Q 都很喜欢) ,每个珠缀都有其各自的重量与承受能力。一个挂缀是稳定的,当且仅当对于其上的每一个珠缀,它下方所有珠缀的重量和(不包含自身)不超过其挂钩的承受能力。
小Q希望她的挂缀尽量长,你能帮她计算出最长可能的稳定挂缀么?当然,如果有多个可选方案,小Q希望总重量最小的。

输入描述 Input Description

第一行包含一个正整数 N,表示商店拥有的珠缀数目。
接下来 N行,每行两个整数(Ci , Wi),分别表示第i 个珠缀的承受能力与重量。

输出描述 Output Description

包行两行。第一行包含一个整数L,表示可以找到的最长稳定挂缀长度。

第二行包含一个整数 W,表示可以找到的长度为 L 的稳定挂缀中的最小重量和。

样例输入 Sample Input

4
3 5
5 1
3 2
4 6

样例输出 Sample Output

3
8

数据范围及提示 Data Size & Hint

对于 30%的数据,N ≤ 10000;
对于 100%的数据,N ≤ 200000;
对于所有的数据,Wi, Ci不超过231

Q

动脑题;

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;typedef long long ll;const ll MAXN=200001;ll n,W,a[MAXN],ans;struct hh{    ll c,w,s;}ma[MAXN];bool cmp(hh a,hh b){    return a.s<b.s;}bool operator < (hh a,hh b){    return a.w<b.w;}priority_queue<hh>q;void solve(){    cin>>n;    for(ll i=1;i<=n;i++)    scanf("%lld%lld",&ma[i].c,&ma[i].w),ma[i].s=ma[i].c+ma[i].w;    sort(ma+1,ma+n+1,cmp);    q.push(ma[1]);    W+=ma[1].w;    ans=1;    for(ll i=2;i<=n;i++)    {        if(ma[i].c<W)         {            hh v=q.top();            if(v.w>ma[i].w)            {                q.pop();                W-=v.w;                W+=ma[i].w;                q.push(ma[i]);            }            else continue;        }        else         {            W+=ma[i].w;            ans++;            q.push(ma[i]);        }           }    cout<<ans<<endl;    cout<<W;}int main(){    solve();    return 0;}
原创粉丝点击