1. 程式人生 > >【Codeforces 492D】Vanya and Computer Game

【Codeforces 492D】Vanya and Computer Game

temp ces font pac urn end its ios 假設

【鏈接】 我是鏈接,點我呀:)
【題意】


題意

【題解】


第一個人攻擊一次需要1/x秒
第二個人攻擊一次需要1/y秒
這兩個數字顯然都是小數。
我們可以二分最後用了多少時間來攻擊。
顯然這個是有單調性的,攻擊時間越多的話,攻擊的次數也就越多。
假設二分出來攻擊的時間是mid
那麽攻擊的次數就是
mid/(1/x) + mid/(1/y)
但是這樣顯然二分出來的也是一個小數。
我們完全沒有辦法根據二分出來的東西判斷它到底是誰的倍數。
因此我們可以這樣。
我們把第一個人攻擊一次和第二個人攻擊一次所需要的時間都乘上一個xy
也就是說我們把秒這個單位換成了自己的一個單位t,而且t = x
y*秒
這樣的話,

第一個人攻擊一次需要的時間就是y t
第二個人攻擊一次需要的時間就是x t
然後我們二分最後需要多少t的時間才夠攻擊a[i]次。
顯然如果二分到mid了
那麽攻擊次數就是mid/y + mid/x
(如果不夠整除的話,顯然就已經不夠敲一次了,所以向下取整就ok了)
然後根據最後二分出來的t值,如果同時是x和y的倍數的話,就是both,否則根據%x和%y的結果的出來最後一次是誰敲的就好了。
(這樣涉及到的運算就都是整數的了)

【代碼】

#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 1e5;

ll n,x,y;

int main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cin >> n >> x >> y;
    while (n--){
        ll cnt;
        cin >> cnt;
        ll l = 1,r = 1e16,temp = -1;
        while (l<=r){
            ll mid = (l+r)/2;
            if (mid/y+mid/x>=cnt){
                temp = mid;
                r = mid - 1;
            }else l = mid + 1;
        }
        if (temp%y==0 && temp%x==0){
            cout<<"Both"<<endl;
        }else if (temp%y==0){
            cout<<"Vanya"<<endl;
        }else {
            cout<<"Vova"<<endl;
        }
    }
    return 0;
}

【Codeforces 492D】Vanya and Computer Game