【PA2014】Bohater 题解(贪心)
前言:一道经典贪心题。
--------------------------
题目大意:你有$z$滴血,要打$n$只怪。打第$i$只怪扣$d_i$滴血,回$a_i$滴血。问是否存在一种能够通关的打怪顺序。
-------------------------------
显然所有怪分为两种:扣血的怪$d_i>a_i$和回血的怪$d_i\leq a_i$。那么贪心策略是什么?
对于回血的怪,我们有若干贪心策略,例如:
1.按照$d_i$升序排列。
2.按照$a_i$降序排列。
3.按照$a_i-d_i$降序排列
$\cdots$
我们选择第一种。打个形象的比喻:假如你砍它一秒一刀$999999999$,但是它一秒一刀砍你$99999999$,你有$9999999$滴血,那显然会挂。所以我们只能从零开始打怪生活。
对于扣血的怪,我们是按照$a_i$降序排列。理由很简单:反正怎么都是扣血,我们还不如先把回血多的怪打了。反正如果你通不了关,那无论什么顺序都没有用。
在输入的时候讲怪进行分类,分别处理即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,z;
struct node
{
int id,d,a;
}add[],kou[];
int addcnt,koucnt;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if (ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=x* +ch-'';ch=getchar();}
return x*f;
}
bool cmp1(node a,node b)
{
return a.d<b.d;
}
bool cmp2(node a,node b)
{
return a.a>b.a;
}
int main()
{
n=read(),z=read();
for (int i=;i<=n;i++)
{
int b=read(),c=read();
if (c>=b){add[++addcnt]=(node){i,b,c};}
else{kou[++koucnt]=(node){i,b,c};}
}
sort(add+,add+addcnt+,cmp1);
sort(kou+,kou+koucnt+,cmp2);
for (int i=;i<=addcnt;i++)
{
if (add[i].d>=z) {cout<<"NIE";return ;}
else z=z-add[i].d+add[i].a;
}
for (int i=;i<=koucnt;i++)
{
if (kou[i].d>=z) {cout<<"NIE";return ;}
else z=z-kou[i].d+kou[i].a;
}
cout<<"TAK"<<endl;
for (int i=;i<=addcnt;i++) cout<<add[i].id<<" ";
for (int i=;i<=koucnt;i++) cout<<kou[i].id<<" ";
return ; }
【PA2014】Bohater 题解(贪心)的更多相关文章
- BZOJ3709 [PA2014]Bohater 【贪心】
题目链接 BZOJ3709 题解 贪心很显然 我们先干掉能回血的怪,当然按照\(d\)升序顺序,因为打得越多血越多,\(d\)大的尽量往后打 然后再干掉会扣血的怪,当然按照\(a\)降序顺序,因为最后 ...
- bzoj3709: [PA2014]Bohater(贪心)
贪心... 可以回血的按d[i]升序防止死掉 不能回血的按a[i]降序,因为只考虑d我们要扣除的血量是一定的,为了不死显然回血多的放前面更好 #include<iostream> #inc ...
- BZOJ 3709 [PA2014]Bohater:贪心【反过来考虑】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3709 题意: 在一款电脑游戏中,你需要打败n只怪物(从1到n编号). 为了打败第i只怪物, ...
- 【BZOJ】3709: [PA2014]Bohater(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=3709 很水的题...但是由于脑洞小..漏想了一种情况.. 首先显然能补血的先杀.. 然后杀完后从补血 ...
- 【BZOJ3709】 [PA2014]Bohater(贪心)
传送门 BZOJ Solution 考虑如果可以回血肯定要打,那么就是按照伤害值从小到大排个序能打就打,不能打就\(NIE\). 接着看不能够回血的,emmm,把这个过程反着看一下就是打一个怪扣\(a ...
- bzoj 3709: [PA2014]Bohater【贪心】
先打能回血的,按消耗从小到大打: 然后按回血量降序打剩下的(把消耗和回血反着看就是上一种怪,打法一样): 中间体力小于0就输出无解 #include<iostream> #include& ...
- 【贪心】bzoj 3709:[PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 653 Solved: ...
- BZOJ3709: [PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 339 Solved: ...
- BZOJ 3709: [PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1050 Solved: ...
- 【BZOJ3716】[PA2014]Muzeum(贪心,网络流)
[BZOJ3716][PA2014]Muzeum(贪心,网络流) 题面 BZOJ 题解 很明显可以写最大权闭合子图,然后会\(TLE\)成傻逼. 为了方便,就把一个警卫能够看到的范围处理一下(把坐标系 ...
随机推荐
- Nmap常见扫描方式流量分析
环境说明 扫描者:manjaro linux , IP地址:192.168.31.160 被扫描者:centos 7,IP地址:192.168.31.175 分析工具:wireshark nmap 版 ...
- day16 函数对象与闭包函数
目录 一.函数对象 1.1函数可以被引用 1.2函数可以作为容器类型的元素 1.3函数可以作为参数传入另外一个函数 1.4函数的返回值可以是一个函数 二.闭包函数 1 什么是闭包函数 2 闭包函数的用 ...
- 查看mysql所有命令
- 管理用户和组 、 tar备份与恢复 、 cron计划任务-云计算学习(4)
配置用户和组账号 问题 本例要求创建下列用户.组以及组的成员关系: 新建用户 alex,其用户ID为3456,密码是flectrag 创建一个名为 adminuser 的组 创建一个名为 natash ...
- React中setState 什么时候是同步的,什么时候是异步的?
class Example extends React.Component { constructor() { super(); this.state = { val: 0 }; } componen ...
- java 面向对象(二十一):属性的赋值顺序
* ①默认初始化 * ②显式初始化/⑤在代码块中赋值 * ③构造器中初始化 * ④有了对象以后,可以通过"对象.属性"或"对象.方法"的方式,进行赋值 * * ...
- (四)学习了解OrchardCore笔记——将模块的名字添加到程序集的ModuleName
关于如何将模块名添加到程序集的ModuleName说简单吧也简单,说不简单吧也不简单. 简单的原因是代码只有几行,不简单的原因是这些都不是c#,都是MSbuild的代码.这可真难为我了,所以这个地方我 ...
- Linux下C ,C ++, Qt开发环境
目录 Linux发行版的选择 安装常用的开发工具(这里针对C/C++/Qt) 安装openGL 中文输入法 安装sublime text 安装vscode apt-get常用命令 Qt环境 Qt常见问 ...
- Go Pentester - HTTP CLIENTS(4)
Interacting with Metasploit msf.go package rpc import ( "bytes" "fmt" "gopk ...
- 【Python学习笔记三】一个简单的python爬虫
这里写爬虫用的requests插件 1.一般那3.x版本的python安装后都带有相应的安装文件,目录在python安装目录的Scripts中,如下: 2.将scripts的目录配置到环境变量pa ...