传送门


思路很妙……

有个前提条件:血量无限,这样话肯定先打会回血的怪,再打会掉血的怪

对于会回血的怪,按照受到伤害的顺序从小往大打

对于会掉血的怪似乎并不是很好搞,考虑:将每一时刻的血量函数画出来,然后反过来看(从右往左看这个函数),就相当于回血量和掉血量互换,会掉血的怪会变成会回血的怪。因为最终的血量是已知的,所以按照上面的方法再做一遍就可以了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<ctime>
  5. #include<cctype>
  6. #include<algorithm>
  7. #include<cstring>
  8. #include<iomanip>
  9. #include<queue>
  10. #include<map>
  11. #include<set>
  12. #include<bitset>
  13. #include<vector>
  14. #include<stack>
  15. #include<cmath>
  16. //This code is written by Itst
  17. using namespace std;
  18. inline int read(){
  19. int a = 0;
  20. char c = getchar();
  21. bool f = 0;
  22. while(!isdigit(c) && c != EOF){
  23. if(c == '-')
  24. f = 1;
  25. c = getchar();
  26. }
  27. if(c == EOF)
  28. exit(0);
  29. while(isdigit(c)){
  30. a = a * 10 + c - 48;
  31. c = getchar();
  32. }
  33. return f ? -a : a;
  34. }
  35. #define PII pair < int , int >
  36. #define st first
  37. #define nd second
  38. #define PIII pair < PII , int >
  39. #define auto vector < PIII > :: iterator
  40. vector < PIII > mons[2];
  41. long long hp , End;
  42. int N;
  43. signed main(){
  44. #ifndef ONLINE_JUDGE
  45. freopen("in","r",stdin);
  46. //freopen("out","w",stdout);
  47. #endif
  48. N = read(); End = hp = read();
  49. for(int i = 1 ; i <= N ; ++i){
  50. int d = read() , a = read();
  51. a >= d ?
  52. mons[0].push_back(PIII(PII(d , a) , i)) :
  53. mons[1].push_back(PIII(PII(a , d) , i));
  54. End = End - d + a;
  55. }
  56. if(End <= 0){puts("NIE"); return 0;}
  57. sort(mons[0].begin() , mons[0].end());
  58. for(auto t = mons[0].begin() ; t != mons[0].end() ; ++t){
  59. if(hp - (*t).st.st <= 0){
  60. puts("NIE"); return 0;
  61. }
  62. hp = hp - (*t).st.st + (*t).st.nd;
  63. }
  64. sort(mons[1].begin() , mons[1].end());
  65. for(auto t = mons[1].begin() ; t != mons[1].end() ; ++t){
  66. if(End - (*t).st.st <= 0){
  67. puts("NIE"); return 0;
  68. }
  69. End = End - (*t).st.st + (*t).st.nd;
  70. }
  71. puts("TAK");
  72. for(auto t = mons[0].begin() ; t != mons[0].end() ; ++t)
  73. printf("%d " , (*t).nd);
  74. reverse(mons[1].begin() , mons[1].end());
  75. for(auto t = mons[1].begin() ; t != mons[1].end() ; ++t)
  76. printf("%d " , (*t).nd);
  77. return 0;
  78. }

BZOJ3709 Bohater 贪心的更多相关文章

  1. 【BZOJ-3709】Bohater 贪心

    3709: [PA2014]Bohater Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 835  Solved:  ...

  2. bzoj3709: [PA2014]Bohater 贪心

    ~~~题面~~~ 题解: 首先有一个比较明显的策略,肯定先要把能带给自己受益的先选完,然后再以最佳状态去打那些会给自己带来损失的怪. 对于前一部分(可以带来受益的怪),显然我们需要先从代价小的打起,因 ...

  3. 【BZOJ4619/3709】[Wf2016]Swap Space/[PA2014]Bohater 贪心

    [BZOJ4619][Wf2016]Swap Space Description 你有许多电脑,它们的硬盘用不同的文件系统储存数据.你想要通过格式化来统一文件系统.格式化硬盘可能使它的容量发生变化.为 ...

  4. bzoj 3709: [PA2014]Bohater 贪心

    题目: 在一款电脑游戏中,你需要打败\(n\)只怪物(从\(1\)到\(n\)编号).为了打败第\(i\)只怪物,你需要消耗\(d_i\)点生命值,但怪物死后会掉落血药,使你恢复\(a_i\)点生命值 ...

  5. BZOJ3709 [PA2014]Bohater 【贪心】

    题目链接 BZOJ3709 题解 贪心很显然 我们先干掉能回血的怪,当然按照\(d\)升序顺序,因为打得越多血越多,\(d\)大的尽量往后打 然后再干掉会扣血的怪,当然按照\(a\)降序顺序,因为最后 ...

  6. DP&图论 DAY 1 下午

    DP&图论  DAY 1  下午  区间和序列上的DP 序列上的DP >序列上的dp状态设计最基本的形式 F[i]表示以 i 结尾的最优值或方案数.◦ F[i][k]表示以 i 结尾附加 ...

  7. bzoj3709: [PA2014]Bohater(贪心)

    贪心... 可以回血的按d[i]升序防止死掉 不能回血的按a[i]降序,因为只考虑d我们要扣除的血量是一定的,为了不死显然回血多的放前面更好 #include<iostream> #inc ...

  8. 【BZOJ3709】 [PA2014]Bohater(贪心)

    传送门 BZOJ Solution 考虑如果可以回血肯定要打,那么就是按照伤害值从小到大排个序能打就打,不能打就\(NIE\). 接着看不能够回血的,emmm,把这个过程反着看一下就是打一个怪扣\(a ...

  9. 【贪心】bzoj3709 [PA2014]Bohater

    把怪分成两类看: 一.回血>损血 则若先杀损血少的再杀损血多的,则为当前这一步提供了更高的可能性.因为血量是单增的,所以尽量用较少的血量去干♂耗血较少的怪物. 二.回血<损血 则若先杀回血 ...

随机推荐

  1. 详解什么是平衡二叉树(AVL)(修订补充版)

    详解什么是平衡二叉树(AVL)(修订补充版) 前言 Wiki:在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树.查 ...

  2. 对配置文件 xml 进行操作

    个人喜欢用 Linq 的方式来进行操作,方便快捷 <?xml version="1.0" encoding="utf-8" ?> <confi ...

  3. 键盘上的"整蛊专家",如何防止短信轰炸机

    "短信轰炸机",是别人通过爬虫或者其他抓取手段在网路上收集那些公司平台短信业务接口的一个集成程序,可能只需要输入一个手机号,对方一整天都会收到各大平台的注册或提醒短信,就是手机在那 ...

  4. Parcelable encountered IOException writing serializable object

    异常: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object 这是在in ...

  5. Android BroadcastReceiver 接收收到短信的广播

    一.知识介绍 1.broadcastReceiver是广播接受者,四大组件之一. 2.Android中内置了很多系统级别的广播,可以在应用程序中得到各种系统的状态信息. 3.使用场景: ①当手机没有电 ...

  6. Visual Studio 无法记忆标签页、断点等的解决办法

    1.到工程目录删除*.suo文件 2.*.suo默认是隐藏的,需要打开查看隐藏文件的开关

  7. 【Linux】SSH证书免密码远程登陆Linux(Putty)

    1.前言 新购置一台便宜服务器做数据库服务器,减轻Web服务器的压力. 为了安全性,root密码设置的非常复杂(随机生成),厌倦了拷贝密码登陆的历史. Putty基本用法都不会的请先花10分钟自行学习 ...

  8. Docker 创建 Confluence6.12.2 中文版

    目录 目录 1.介绍 1.1.什么是Confluence? 2.Confluence的官网在哪里? 3.如何下载安装? 4.对 Confluence 进行配置 4.1.设置 Confluence 4. ...

  9. Ext.grid.panel 改变某一行的字体颜色

    grid.getStore().addListener('load', handleGridLoadEvent); function handleGridLoadEvent(store, record ...

  10. logback日志配置

    第一步:加入jar包.要加入slf4j和logback的jar包,slf4j需要的jar包为slf4j-api,logback需要2个jar包(logback-classic.logback-core ...