2018ICPC 焦作 B - Ultraman vs. Aodzilla and Bodzilla(贪心,思维)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018ICPC 焦作 B - Ultraman vs. Aodzilla and Bodzilla(贪心,思维)相关的知识,希望对你有一定的参考价值。
找到最小的 n n n满足 ∑ i = 1 n i > = h p a + h p b \\sum\\limits_{i=1}^ni>=hp_a+hp_b i=1∑ni>=hpa+hpb
可以证明,在 n n n轮对决中打死两个怪物一定是最优的(因为可以选择先打死 A A A或先打死 B B B)
定义 p r e i = ∑ j = 1 i j pre_i=\\sum\\limits_{j=1}^i j prei=j=1∑ij
考虑如果先打死 A A A
找到最小的 p 1 p_1 p1满足 p r e p 1 > = h p a pre_{p_1}>=hp_a prep1>=hpa,前 p 1 p_1 p1次都打 A A A,后面都打 B B B
①.若此时 p r e n − p r e p 1 > = h p b pre_n-pre_{p_1}>=hp_b pren−prep1>=hpb,保留此方案.已经满足字典序最小
②.若此时 p r e n − p r e p 1 < h p b pre_n-pre_{p_1}<hp_b pren−prep1<hpb,说明之前打 A A A浪费了一些攻击力
需要把某次对 A A A的攻击转移到攻击 B B B去,而且需要满足攻击的尽量晚(字典序最小)
于是我们在第 p r e p 1 − h p a pre_{p_1}-hp_a prep1−hpa个回合去打 B B B即可,这样仍然是刚好打完 A A A,且 字典序最小
考虑如果先打死 B B B
找到最小的 p 1 p_1 p1满足 p r e p 1 > = h p b pre_{p_1}>=hp_b prep1>=hpb,前 p 1 p_1 p1次都打 B B B,后面都打 A A A
考虑第 p 1 p_1 p1次攻击溢出了 p r e p 1 − h p b pre_{p_1}-hp_b prep1−hpb的伤害,可以将前面若干次攻击替换给 A A A
不妨二分到一个最大的点使得 p r e p 2 < = p r e p 1 − h p b pre_{p_2}<=pre_{p_1}-hp_b prep2<=prep1−hpb
这样前 p 2 p_2 p2次攻击都打 A A A,之后一直打 B B B直到打死,再一直打 A A A
①.若 p r e n < h p a + h p b + ( p r e p 1 − h p b − p r e p 2 ) pre_{n}<hp_a+hp_b+(pre_{p_1}-hp_b-pre_{p_2}) pren<hpa+hpb+(prep1−hpb−prep2)
也就是 p r e n + p r e p 2 > = h p a + p r e p 1 pre_n+pre_{p_2}>=hp_a+pre_{p_1} pren+prep2>=hpa+prep1,可以在剩余时间内打掉 A A A,确定此方案为最终方案
②.否则,还是浪费的太多了,我们至少应该再有 z = h p a + p r e p 1 − p r e n − p r e p 2 z=hp_a+pre_{p_1}-pre_n-pre_{p_2} z=hpa+prep1−pren−prep2点数值去攻击 A A A
于是我们不在第 p 2 p_2 ACM-ICPC 2018 焦作赛区网络预赛 B题 Mathematical Curse
icpc2018焦作Mathematical Curse(动态规划)