点击打开codeforces题目链接

题意

有N个怪兽,有2个人在杀怪,每个怪兽都有一个生命值ai,这个怪兽要打ai次才能杀死。第一个人每秒打x下,第二个人每秒打y下,问你每个怪兽最后一次被打是被谁打死的。

分析

首先这两个人每秒种的打怪次序都是相同的,并且每一秒的打怪总次数都是相同的,那么先用ai对每秒的打怪总次数取模。其次,这两个人在每秒的内部可能会有共同打怪的时候,即x和y的最小公倍数次时。那么这要暴力从0到这个区间的打怪情况,最后取模找这个区间的值输出即可。

分析

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

struct Node {
    ll time; int id;
    Node(ll time, int id):time(time), id(id) {}
    bool operator < (const Node &rhs) const {
        return time < rhs.time;
    }
};

int main() {
    ll n, x, y; cin >> n >> x >> y;
    ll com = ((ll)x * y) / __gcd(x, y);
    vector<Node> v;
    for(int i = 1; x * i <= com; ++i)
        v.push_back(Node(x*i, 1));
    for(int i = 1; y * i <= com; ++i)
        v.push_back(Node(y*i, 2));
    sort(v.begin(), v.end());
    for(int i = 0; i < n; ++i) {
        ll t; cin >> t; t--; t %= (x + y); t %= v.size();
        if(t == v.size()-1 || t == v.size()-2) puts("Both");
        else if(v[t].id == 1) puts("Vova");
        else puts("Vanya");
    }
    return 0;
}

欢迎留言