CF492 D. Vanya and Computer Game

Problem - 492D - Codeforces

 

题意:

有n只怪兽,第i只怪兽被打ai次之后才会死

有2个人分别以1秒种攻击x、y次攻击所有怪兽

问第i只怪兽最后死在谁的手里

 

两个人分别每1/x、1/y秒攻击一次,即1/gcd(x,y)是一个周期

在这个周期里,两个人分别攻击x/gcd、y/gcd次

第i次攻击的时间分别是i/x,i/y

把一个周期里的所有攻击时间从小到大排序

然后根据怪兽血量判断出是被周期内第几次恰好打死

就知道是死在谁手里了

时间是小数可能有精度误差,所以把所有的时间乘上lcm(x,y)转换为整数再比较

 

#include<bits/stdc++.h>
 
using namespace std;
 
#define N 100002
 
int a[N];
struct node
{
    long long tim;
    int who;
}e[N*20]; 
 
bool cmp(node p,node q)
{
    return p.tim<q.tim;
}
 
int main()
{
    int n,x,y;
    scanf("%d%d%d",&n,&x,&y);
    for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    int gcd=__gcd(x,y);
    long long lcm=1ll*x*y/gcd;
    int sx=x/gcd,sy=y/gcd;
    long long tx=lcm/x,ty=lcm/y;
    int m=0;
    for(int i=1;i<=sx;++i) 
    {
        e[++m].tim=tx*i;
        e[m].who=1;
    }
    for(int i=1;i<=sy;++i) 
    {
        e[++m].tim=ty*i;
        e[m].who=2;
    }
    sort(e+1,e+m+1,cmp);
    int h=0;
    for(int i=1;i<=n;++i)
    {
        h=a[i]%m;
        if(!h || h==m-1) printf("Both\n");
        else if(e[h].who==1) printf("Vanya\n");
        else printf("Vova\n");
    }
}

 

posted @ 2021-10-04 19:25  TRTTG  阅读(51)  评论(0编辑  收藏  举报