2017年浙江中医药大学大学生程序设计竞赛(重现赛)D - CC的神奇背包
2017-12-21 15:12
351 查看
题目描述
cc最近收到了好多礼物,对着满地大小不一的礼物,她想要一个包来装,于是dd就掏出了一个会说话的神奇背包给cc装礼物。cc为了一次性装尽可能多的礼物,于是跟这个背包定下了一个规则,对每个礼物,背包会给出它对这件礼物的喜爱程度,背包越喜欢这个礼物,它就会越开心,越开心,它就会扩大自己的容量。
于是问题就变成了这样:每个礼物都有自己的体积ai,背包也会给出它对这些礼物的喜爱程度bi,并且为了方便cc计算,背包告诉cc,喜爱程度bi就是这件物体放进背包,背包后会扩大的体积。
那么现在cc想知道,对这一地的礼物,有没有某种放的顺序,可以一次性把所有礼物都放进包里?
当然,物体要先放进背包,背包才会扩大自己的体积
比如当前背包的剩余体积为2,礼物的体积为3,喜爱程度为4,也是不能放进背包的。
输入描述:
输入包含多组数据,第一行为一个整数T(1<=T<=20) 每组数据第一行包含两个整数n,v(1<=n,v<=1000)表示共有n个礼物,背包一开始的体积为v 接下去的n行每行包含两个整数ai,bi(1<=ai,bi<=1000)表示每个礼物的体积ai与背包对这件礼物的喜爱程度bi 1 <= T <= 20 1 <= n, v <= 100000 1 <= ai, bi <= 100000
输出描述:
若存在一种放礼物的顺序可以让cc把所有礼物放进背包,则输出"yes"否则输出"no"(引号不包含在内)
示例1
输入
1 4 2 1 2 2 1 3 1 2 3
输出
yes
题解
贪心。先把能放进去的且能扩大容量或者保持容量不变的那些都加进去。
加完之后必然是最大容量了。这个时候再慢慢塞减少容量的那些东西即可。细节注意一下。
#include <bits/stdc++.h> using namespace std; const int maxn = 100000 + 10; int T; int n; long long v; struct X { long long a, b; }p[maxn]; bool cmp(const X&a, const X&b) { return a.a < b.a; } bool cmp2(const X&a, const X&b) { return a.b < b.b; } int main() { scanf("%d", &T); while(T --) { scanf("%d%lld", &n, &v); for(int i = 1; i <= n; i ++) { long long x, y; scanf("%lld%lld", &x, &y); p[i].a = x; p[i].b = y - x; } int sum = 0; sort(p + 1, p + 1 + n, cmp); for(int i = 1; i <= n; i ++) { if(p[i].b >= 0 && p[i].a <= v) { v = v + p[i].b; sum ++; } } if(sum == n) { printf("yes\n"); continue; } int flag = 1; for(int i = 1; i <= n; i ++) { if(p[i].a > v) { flag = 0; break; } } if(flag == 0) { printf("no\n"); continue; } sort(p + 1, p + 1 + n, cmp2); for(int i = n; i >= 1; i --) { if(p[i].b >= 0) continue; if(p[i].a <= v) { v = v + p[i].b; } else { flag = 0; break; } } if(flag == 0) { printf("no\n"); continue; } printf("yes\n"); } return 0; }
相关文章推荐
- 2017年浙江中医药大学大学生程序设计竞赛(重现赛)F - 开心的cc
- 2017年浙江中医药大学大学生程序设计竞赛(重现赛)-H剪纸
- 2017年浙江中医药大学大学生程序设计竞赛(重现赛)A - 不存在的树
- 2017年浙江中医药大学大学生程序设计竞赛(重现赛)H - 剪纸
- 2017年浙江中医药大学大学生程序设计竞赛(重现赛)
- 2017年浙江中医药大学大学生程序设计竞赛(重现赛)B - 一生之敌
- 2017年浙江中医药大学大学生程序设计竞赛(重现赛)C - 寻找zcmu
- 【2017年浙江中医药大学大学生程序设计竞赛】F 开心的cc 【线段树+思维】
- nowcoder 2017年浙江工业大学大学生程序设计迎新赛预赛- CC的神奇背包
- 2017年浙江中医药大学大学生程序设计竞赛 - B 一生之敌 (二分)
- 2017年浙江中医药大学大学生程序设计竞赛-A:不存在的树(树链剖分)
- 2017年浙江中医药大学大学生程序设计竞赛 - C 寻找zcmu
- FZU Problem 2214 Knapsack problem(01背包,超大背包)——第六届福建省大学生程序设计竞赛-重现赛
- 【2017年浙江中医药大学大学生程序设计竞赛】B一生之敌 【二分+精度】
- 2017年浙江中医药大学大学生程序设计竞赛 - H 剪纸(DFS)
- 第六届福建省大学生程序设计竞赛-重现赛,Problem C Knapsack problem【大背包】
- 【HDU5932 2016CCPC东北地区大学生程序设计竞赛 - 重现赛 K】【树上背包 贪心乱搞】Backpack on Tree 物品成本只有12345下的树上背包
- xtu 1260 Determinant [2017年“嘉杰信息杯” 中国大学生程序设计竞赛全国邀请赛(湖南) A]
- 第八届福建省大学生程序设计竞赛-重现赛 A Frog
- HDU Basic Data Structure 2016CCPC东北地区大学生程序设计竞赛 - 重现赛