BZOJ 3709 [PA2014]Bohater:贪心【反过来考虑】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3709
题意:
在一款电脑游戏中,你需要打败n只怪物(从1到n编号)。
为了打败第i只怪物,你需要消耗atk[i]点生命值,但怪物死后会掉落血药,使你恢复rec[i]点生命值。
任何时候你的生命值都不能降到0(或0以下)。
请问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉。
题解:
怪物总共分两种,一种是打完能回血的,一种是打完会掉血的。
显然,先打能回血的,再打能掉血的。
分别考虑两种怪:
(1)能回血的:
显然,先打atk小的怪物。按atk升序排列。
(2)会掉血的:
最后打完所有怪之后的血量end是一定的。
那么将这个过程反过来考虑:初始血量为end,每打一个怪物掉rec[i]的血,然后回atk[i]的血。
所以按照rec降序排列。
最后模拟一遍能不能打完就行了。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 100005 using namespace std; struct Mons
{
int atk;
int rec;
int idx;
Mons(int _atk,int _rec,int _idx)
{
atk=_atk;
rec=_rec;
idx=_idx;
}
Mons(){}
friend bool operator < (const Mons &a,const Mons &b)
{
if(a.rec-a.atk>= && b.rec-b.atk>=) return a.atk<b.atk;
else if(a.rec-a.atk< && b.rec-b.atk<)return a.rec>b.rec;
return a.rec-a.atk>b.rec-b.atk;
}
}; int n;
long long hp;
bool failed=false;
Mons mons[MAX_N]; void read()
{
cin>>n>>hp;
for(int i=;i<=n;i++)
{
cin>>mons[i].atk>>mons[i].rec;
mons[i].idx=i;
}
} void solve()
{
sort(mons+,mons+n+);
for(int i=;i<=n;i++)
{
hp-=mons[i].atk;
if(hp<=)
{
failed=true;
break;
}
hp+=mons[i].rec;
}
} void print()
{
if(failed)
{
cout<<"NIE"<<endl;
return;
}
cout<<"TAK"<<endl;
for(int i=;i<=n;i++)
{
cout<<mons[i].idx<<" ";
}
cout<<endl;
} int main()
{
read();
solve();
print();
}
BZOJ 3709 [PA2014]Bohater:贪心【反过来考虑】的更多相关文章
- bzoj 3709: [PA2014]Bohater 贪心
题目: 在一款电脑游戏中,你需要打败\(n\)只怪物(从\(1\)到\(n\)编号).为了打败第\(i\)只怪物,你需要消耗\(d_i\)点生命值,但怪物死后会掉落血药,使你恢复\(a_i\)点生命值 ...
- 【贪心】bzoj 3709:[PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 653 Solved: ...
- BZOJ 3709: [PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1050 Solved: ...
- bzoj 3709: [PA2014]Bohater【贪心】
先打能回血的,按消耗从小到大打: 然后按回血量降序打剩下的(把消耗和回血反着看就是上一种怪,打法一样): 中间体力小于0就输出无解 #include<iostream> #include& ...
- 【BZOJ 3709: [PA2014]Bohater】
首先,这是我n久之前培训的时候老师讲的题目了,今天突然看到,那就讲讲吧. 首先,我们考虑怎么打怪... 显然,我们需要保证这个怪要尽可能的打死(就是尽量不被干死),并且保证尽可能的净获得血量大的在前面 ...
- 3709: [PA2014]Bohater
3709: [PA2014]Bohater 或者:Bohater 题解 好狠啊这个题 z 要开 long long ,可能算掉血回血的时候会爆 long long 吧 首先把能回血的怪打死(不然你后面 ...
- 【BZOJ】3709: [PA2014]Bohater(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=3709 很水的题...但是由于脑洞小..漏想了一种情况.. 首先显然能补血的先杀.. 然后杀完后从补血 ...
- 【BZOJ4619/3709】[Wf2016]Swap Space/[PA2014]Bohater 贪心
[BZOJ4619][Wf2016]Swap Space Description 你有许多电脑,它们的硬盘用不同的文件系统储存数据.你想要通过格式化来统一文件系统.格式化硬盘可能使它的容量发生变化.为 ...
- BZOJ 3716 [PA2014]Muzeum 贪心SET最大闭合子图
看上去像是一个最大权闭合子图裸题但是数据太大 我们可以先把守卫的视野转换到第二象限(每个守卫可以看到横坐标比他小 纵坐标比他大的宝物) 然后按X从小到大 再按Y从大到小排 这样我们就可以按SORT序遍 ...
随机推荐
- Android 基于Retrofit+Rxjava搭建的简单易用的网络架构
装逼開始之前,为大家推荐两篇文章,用来更好的学习Retrofit和Rxjava. 在这里我们要感谢互联网装逼行业勇于献身,甘于奉献的的大婶们. 我仅代表个人,给您们跪舔了. Retrofit:Retr ...
- CentOS开启FTP及配置用户
vsftpd作为FTP服务器,在Linux系统中是非常常用的.下面我们介绍如何在centos系统上安装vsftp. 什么是vsftpd vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序 ...
- OpenCV实现图像颜色特征提取
https://github.com/ictlyh/ImageFeature 链接:http://pan.baidu.com/s/1mhUoPxI 密码:3cnn
- linux下开启ftp的21号port
1.先执行vsftpd服务: #service vsftpd start 2.通过iptables开放21号port (1) 先查看iptables设置: #iptables -nL Chain IN ...
- 06 php 单例模式
一:单例模式的三大原则 (1)构造函数需要标记为非public(防止外部使用new操作符创建对象),单例类不能在其他类中实例化,只能被自身实例化. (2)拥有一个保存类的实例的静态成员变量$_inst ...
- CPI
CPI (Consumer Price Index 物价指数) 是政府用来衡量通货膨胀的其中一个数据.通俗的讲,CPI就是市场上的货物价格增长百分比.一般市场经济国家认为CPI在2-3%属于可接受范围 ...
- python 基础 7.7 json--上
一. 文件json ...
- HDU 1853 Cyclic Tour[有向环最小权值覆盖]
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...
- 引用变量的类型强转以及InstanceOf方法的使用
引用到的类: class Person{ String name; } class Student extends Person{ String sut_no; } class ClassMate e ...
- protobuf + maven 爬坑记
疯狂创客圈 死磕Netty 亿级流量架构系列之20 [博客园 总入口 ] 本文说明 本篇是 netty+Protobuf 整合实战的 第一篇,完成一个 基于Netty + Protobuf 实战案例. ...