bzoj3709: [PA2014]Bohater 贪心
题解:
首先有一个比较明显的策略,肯定先要把能带给自己受益的先选完,然后再以最佳状态去打那些会给自己带来损失的怪。
对于前一部分(可以带来受益的怪),显然我们需要先从代价小的打起,因为这样可以把生命值越积越多,打代价大的怪也更容易成功。
那么对于后一部分怎么办呢?我们需要从受益大的打起,为什么?
证明:
假设一个怪的受益为back,代价为cost,那么首先假设我们打完所有怪之后剩下have的生命值,那么have的大小是固定的,不会随着操作顺序而改变,因此我们可以考虑用这个来倒推最优策略。
那么就是要使得这个倒推尽可能成功,观察一下,在倒推的过程中,相当于是不断的后悔打某个怪,那么就相当于减去back,加上cost。
因此这就是一个和上一部分类似的问题,所以在倒推的时候需要按照back从小到大取,那么从正向来看,就是按照back从大到小取。
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 250100
#define LL long long int n;
LL have;
int q[AC], top;
struct node{
int cost, back, id;
}s[AC]; inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} inline bool cmp1(node a, node b){
return a.cost < b.cost;
} inline bool cmp2(node a, node b){
return a.back > b.back;
} void pre()
{
n = read(), have = read();
for(R i = ; i <= n; i ++)
s[i].cost = read(), s[i].back = read(), s[i].id = i;
} void work()
{
sort(s + , s + n + , cmp1);
for(R i = ; i <= n; i ++)
if(s[i].cost <= s[i].back)
{
if(s[i].cost >= have) {printf("NIE\n"); return ;}
have += s[i].back - s[i].cost;
q[++top] = s[i].id;
}
sort(s + , s + n + , cmp2);
for(R i = ; i <= n; i ++)
if(s[i].cost > s[i].back)
{
if(s[i].cost >= have) {printf("NIE\n"); return ;}
have += s[i].back - s[i].cost;
q[++top] = s[i].id;
}
printf("TAK\n");
for(R i = ; i <= top; i ++) printf("%d ", q[i]);
} int main()
{
//freopen("in.in", "r", stdin);
pre();
work();
//fclose(stdin);
return ;
}
bzoj3709: [PA2014]Bohater 贪心的更多相关文章
- [bzoj3709][PA2014]Bohater_贪心
bzoj-3709 PA-2014 Bohater 题目大意:在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i ...
- 【BZOJ-3709】Bohater 贪心
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 835 Solved: ...
- BZOJ3709: [PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 339 Solved: ...
- BZOJ3709 [PA2014]Bohater 【贪心】
题目链接 BZOJ3709 题解 贪心很显然 我们先干掉能回血的怪,当然按照\(d\)升序顺序,因为打得越多血越多,\(d\)大的尽量往后打 然后再干掉会扣血的怪,当然按照\(a\)降序顺序,因为最后 ...
- bzoj3709: [PA2014]Bohater(贪心)
贪心... 可以回血的按d[i]升序防止死掉 不能回血的按a[i]降序,因为只考虑d我们要扣除的血量是一定的,为了不死显然回血多的放前面更好 #include<iostream> #inc ...
- 【贪心】bzoj3709 [PA2014]Bohater
把怪分成两类看: 一.回血>损血 则若先杀损血少的再杀损血多的,则为当前这一步提供了更高的可能性.因为血量是单增的,所以尽量用较少的血量去干♂耗血较少的怪物. 二.回血<损血 则若先杀回血 ...
- 【BZOJ4619/3709】[Wf2016]Swap Space/[PA2014]Bohater 贪心
[BZOJ4619][Wf2016]Swap Space Description 你有许多电脑,它们的硬盘用不同的文件系统储存数据.你想要通过格式化来统一文件系统.格式化硬盘可能使它的容量发生变化.为 ...
- 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: ...
随机推荐
- package.json中的devDependencies和dependencies有啥区别?
如果你的项目是发布到npm的一个包, 那么这个包的package.json中的dependencies中的依赖是会被下载下来到这个包的node_modules文件夹中的(如果你的项目本身没有这个依赖) ...
- 「日常训练」 Genghis Khan the Conqueror(HDU-4126)
题意 给定\(n\)个点和\(m\)条无向边(\(n\le 3000\)),需要将这\(n\)个点连通.但是有\(Q\)次(\(Q\le 10^4\))等概率的破坏,每次破坏会把\(m\)条边中的某条 ...
- ReadyAPI 教程和示例(二)
声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 接上一篇: 4.修改SoapUI测试 本节将演示如何为测试用例添加测试步骤以及更改请求参 ...
- Linux命令应用大词典-第25章 备份与还原
25.1 mkisofs:创建ISO9660/Joliet/hfs文件系统
- lesson 21 Daniel Mendoza
lesson 21 Daniel Mendoza bare 赤裸的 :boxers fought with bare fists crude 天然的:crude sugar, crude oil 粗俗 ...
- CsvHelper文档-1前言
CsvHelper文档-1前言 英文文档链接地址:CsvHelper Document 开源项目地址:CsvHelper 翻译于2018-1-5,原本可能会随时更新: 每一段代码都是经过我实际测试的, ...
- ionic ios样式偏移解决方案。
在css属性内增加: .item-ios [item-end] { //解决ios系统上尾部图标出现重影而增加的格式. margin: 0px -15.3px 0px 0px; margin-bott ...
- “Hello World!”团队——Alpha发布用户使用报告
博客内容: 1.用户体验报告表 2.用户评论截图 3.总结 一.用户体验报告表 用户使用报告 用户序号 用户姓名(化名) 性别 用户职业 使用频次 用户评论 1 小董 女 文学在读硕士 5 1.游戏界 ...
- c# 委托初窥
1.委托可以把方法当作参数在另一个方法中传递和调用 ,委托是方法的快捷方式. 2.委托是一个类. private void BeginSocketThread() { try { IPEndPoint ...
- python 项目配置虚拟环境
# Windows 环境1, 安装 Visual C++ 2015 Build Tools, 依赖.Net Framework 4.6, 安装包位置 ./tools/windows/visualcpp ...