您的位置:首页 > 其它

【ctsc2007】【挂缀】

2015-07-05 20:42 288 查看
题目描述 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


题解:可以证明吊坠顺序从下向上一定按C+W升序,然后我们按C+W排序,扫一遍即可,如果能往上挂就挂上,否则和已挂链中的最大重量比较,如果小于,就删去那个吊坠,加入新的吊坠。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue> 
using namespace std;
priority_queue<long long> q;
long long ans,tot,n;
struct use{long long  w,c,z;}a[1000001];
inline bool cmp(use x,use y){return x.z<y.z;}
inline long long in()
{
    long long x=0;
    char ch;
    ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x;
}
int main()
{
	freopen("pendant.in","r",stdin);freopen("pendant.out","w",stdout);
	n=in(); 
	for (int i=1;i<=n;i++){
		  a[i].c=in();a[i].w=in();
		  a[i].z=a[i].w+a[i].c;
	  }
	sort(a+1,a+n+1,cmp);
	for (int i=1;i<=n;i++)
	  {
	    if (a[i].c>=tot){ans++;q.push(a[i].w);tot+=a[i].w;}
	    else if (a[i].w<q.top()){tot+=a[i].w-q.top();q.pop();q.push(a[i].w);}
	  }
	cout<<ans<<endl<<tot<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: