CF492D Vanya and Computer Game

知识点:二分

我发现二分的题目会有一些或多或少带一点数学的东西,这个题,显然符合单调性,就是存在一个时间点,血量降为零,然后后面的都是小于等于0了,很显然,可以用二分来求解,但是我们可以求出来一个小数的时间,怎么判断是哪个人给的最后一击成了一个问题,看到两人每隔一段时间攻击,有点数字信号处理那味,感觉可以把求小数变成求整数,我们发现绝对的时间是小数,但是相对的倍数是整数,是谁的倍数呢,一个人是1/x,一个是1/y,直觉可以发现我们把求得得答案变成求1/xy得倍数,这样最后答案一定是整数,因为求得的1/xy的倍数如果能整除y,说明最后是第一个人击杀的,能整除第二个数说明是第二个人击杀的,如果都能整除,说明是两人人同时击杀的,这样这个题的代码就出来了

#include <bits/stdc++.h>

using namespace std;

int n, a, b;

int main() {
	cin >> n >> a >> b;
	while (n--) {
		int t;
		cin >> t;
		long long l = 0, r = 1e15 + 5;
		while (l < r) {
			long long mid = (l + r) >> 1;
			if (mid / a + mid / b >= t) r = mid;
			else l = mid + 1;
		}
		if (l % b == 0 && l % a == 0) cout << "Both\n";
		else if (l % b == 0) cout << "Vanya\n";
		else if (l % a == 0) cout << "Vova\n";
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值