【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排序,扫一遍即可,如果能往上挂就挂上,否则和已挂链中的最大重量比较,如果小于,就删去那个吊坠,加入新的吊坠。
“珠缀花蕊,人间几多酸泪”……
挂缀在很早就被人们作为一种装饰品,垂坠的风韵,华丽摇曳的摆动,展现出一种与众不同的优雅与高贵。而我们的主人公小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; }
相关文章推荐
- eclipse 远程调试mapreduce
- E题hdu 1425 sort
- OpenFlow Switch学习笔记(四)——Matching
- 青蛙跳台问题
- 码农、黑客和2B程序员之间的区别
- [LeetCode][Java] Two Sum
- XMLHttpRequest对象的属性和方法
- 数据结构基础 之 树与二叉树 各类操作、思想与实现
- MD5 加密
- 2016, Hillary Clinton Win!
- 欢迎使用CSDN-markdown编辑器
- OpenGL的版本历史和发展
- xib自定义UIView报错误 "forUndefinedKey:]: this class is not key value coding-compliant for the key"
- MVC强类型视图、强类型HTML辅助方法
- js实现:'w5-8' -> /^\w{5,8}$/
- 一种JAVA线程轮训调度算法(转载)
- Hadoop小练习——利用MapReduce求平均数
- 51nod 算法马拉松3 A:序列分解
- [华为机试练习题]58.查找同构数的数量
- 51nod 算法马拉松3 A:序列分解