知识点:二分
我发现二分的题目会有一些或多或少带一点数学的东西,这个题,显然符合单调性,就是存在一个时间点,血量降为零,然后后面的都是小于等于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;
}