http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=89215
起初我是二分枚举第一个人的攻击次数发现有问题,意识到要二分枚举杀死怪兽的时间,那么问题来了如何处理每1/x秒攻击一次,因为二分边界和mid都是int型。由此想到做一个等价的变换如代码中的注释。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
long long n,x,y,key;
//第一个:x*y秒攻击x次,每y秒攻击1次
//第二个:x*y秒攻击y次,每x秒攻击1次
bool IsGood(long long time){
if((time / y + time / x) >= key) return true;
return false;
}
int main(){
scanf("%I64d%I64d%I64d",&n,&x,&y);
for(int i=0; i<n; i++){
scanf("%I64d",&key);
long long l = 0, r = 1e18, ans;
while(l <= r){
long long mid = (l + r) >> 1;
if(IsGood(mid)) {r = mid - 1; ans = mid;}
else l = mid + 1;
}
if(!(ans % x) && !(ans % y)) puts("Both");
else if(!(ans % x)) puts("Vova");
else puts("Vanya");
}
//system("pause");
return 0;
}