CF492 D. Vanya and Computer Game
题意:
有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"); } }