Nowcoder200520 -- 打 boss

题目

玩家正在与怪物 boss 对战,玩家有血量 HP1 、攻击力 ATK1 ,boss 有血量 HP2 、攻击力 ATK2 、每回合回血量 M。

对战是回合制,每回合分三个阶段:
1. 玩家攻击怪物,怪物减少 ATK1 点血
2. 怪物攻击玩家,玩家减少 ATK2 点血
3. 怪物回血 M 点
请判断玩家能否将 boss 打败,即是否存在任t意时刻满足 boss 血量 ≤0 且玩家血量 >0 。

输入描述:
第一行一个整数 T ,表示数据组数。

接下来 T 行,每行五个整数,分别表示 HP1 、 HP2 、 ATK1 、 ATK2 、M,均为正整数且不超过 10^9。

保证 1<= T <= 10^5.

输出描述:
每组数据输出一行一个字符串,玩家能将 boss 打败 ,输出 Yes ,否则输出 No 。

输入
2
100000 2 2 20 2
114514 1919810 1 1 1

输出
Yes
No

说明
第一组数据:第一回合玩家攻击 boss 后 boss 被打败
第二组数据:第 114514 回合玩家血量归零而 boss 血量 > 0

题意:按照题目的攻击次序,看玩家是否能把Boss打死。
题解:
if:a1 >= hp2 Y; 因为此时玩家可以一次打死Boss
else if :m >= a1 N; 此时玩家一次打不死Boss,并且Boss恢血量大于攻击量,相当于可以完全抵消玩家的攻击(*)
else:
{

  1. if:a2 >= hp1 N; 此时Boss可以一次打死玩家

  2. else
    {

    设置x = hp1 / a2,x为玩家被打死的次数,并把x向上取整,因为不能整除,说明Boss还需要打一次玩家才能死
    假如玩家要打死Boss需y次,那么a1 * y - m * (y - 1) >= hp2,这时候我们将方程进行变换一下, 可得 y = (hp2 - m) / (a1 - m), 并且把y向上取整,原理一样。
    最后如何x >= y 那么说明玩家可以打死Boss,因为尽管在他们两个互相打死对方的次数一样的情况下,按照顺序,玩家肯定先一步打死Boss
    }

}

注意的点就是打*的那个特判,因为只有在下面的a1 != m,才能求出y的值,因为分母不能为0,此外,最好把这些计算的值设为double,因为需要向上取整,假如都是整数,那么向上取整的意义就不存在了,结果也就错误了。举个栗子:比如8/3,直接整型相除,结果是2,向上取整还是2,而我们所需的应该是3。

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
typedef long long LL;
double hp1, hp2, a1, a2, m;
int t;
int main()
{
	ios::sync_with_stdio(false);
	freopen("cin.in", "r", stdin);
	freopen("cout.out", "w", stdout);
	cin >> t;
	while(t --)
	{
		cin >> hp1 >> hp2 >> a1 >> a2 >> m;
		if(a1 >= hp2) cout << "Yes" << endl;
		else if(m >= a1) cout << "No" << endl;
		else
		{
			if(a2 >= hp1) cout << "No" << endl;
			else
			{
				LL x1 = ceil(hp1 / a2);
				LL x2 = ceil((hp2 - m) / (a1 - m));
				if(x1 >= x2) cout << "Yes" << endl;
				else cout << "No" << endl;
			} 
		}
	}
	
	return 0;
}
posted @ 2020-10-19 17:40  ~K2MnO4  阅读(149)  评论(0)    收藏  举报