3709: [PA2014]Bohater|贪心
2016-03-09 19:10
387 查看
首先显然是先把加血的怪物都干掉,然后再干掉那些减血的怪物
最初的血量是确定的,干掉加血的怪物时可以按照耗血量从小到大的顺序都干掉,这个也比较显然。
然后就是按什么顺序打减血的怪物,因为最终的血量是确定的,所以可以倒过来想,发现和最初的 “干掉加血的怪物时可以按照耗血量从小到大的顺序都干掉”正好相反,也就是对减血的怪物按加血的量从大到小排序挨个打掉
最初的血量是确定的,干掉加血的怪物时可以按照耗血量从小到大的顺序都干掉,这个也比较显然。
然后就是按什么顺序打减血的怪物,因为最终的血量是确定的,所以可以倒过来想,发现和最初的 “干掉加血的怪物时可以按照耗血量从小到大的顺序都干掉”正好相反,也就是对减血的怪物按加血的量从大到小排序挨个打掉
#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<vector> #include<queue> #include<cmath> #include<set> #include<map> #define N 100066 using namespace std; int sc() { int i=0;char c=getchar(); while(c>'9'||c<'0')c=getchar(); while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i; } struct W{int plu,mi,p;}a ; long long now,n,flag; bool cmp(W a,W b) { int x=a.plu-a.mi; int y=b.plu-b.mi; if(x>=0&&y>=0)return a.mi<b.mi; else if(x*y<=0)return x>=0; else return a.plu>b.plu; } int main() { n=sc(),now=sc(); for(int i=1;i<=n;i++) a[i].mi=sc(),a[i].plu=sc(),a[i].p=i; sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { now-=a[i].mi; if(now<=0){flag=1;break;} now+=a[i].plu; } if(flag)puts("NIE"); else { puts("TAK"); for(int i=1;i<=n;i++) printf("%d ",a[i].p); } return 0; }
相关文章推荐
- 1.一些 贪心算法 的简单思维题:
- 贪心算法——字典序最小问题
- 贪心算法——区间调度问题
- Jump Game I,II 贪心
- Wildcard Matching
- 贪心法实现无向图的划分 代码
- 贪心题目循环和控制台折行
- HDOJ 1009
- 【解题报告】【USACO】酸奶工厂
- 【解题报告】【】交谊舞
- POJ 1328
- Best Cow Line
- HDU 1009 Fatmouse's Trade
- POJ2377 Bad Cowtractors
- 贪心 hdu 1003
- 最大容器
- 满足和为定值的两个数或多个数
- Codeforces Round #300
- HUD1052 __ P2 1002 __ Tian Ji -- The Horse Racing
- 2015年国家集训队测试 BZOJ3816矩阵变幻