Codeforces Round #280 (Div. 2)

来源:互联网 发布:网站源码什么意思 编辑:程序博客网 时间:2024/04/29 23:17

这场题简单的令人吃惊


ABC几乎都是签到题


D的话

把两个人的射击时间转化成整数

求个gcd,除一下。

假设两人的射击频率分别是1秒x,1秒y

x,y的gcd为g

转化一下就相当于

第一个人 y/g 秒射一发, 第二个人x/g秒射一发

然后两个人在 x/g*y/g 秒时会同时射击

那么每个x/g*y/g秒就是一个周期了

假设怪物的血有a,那么a%(x+y)就是最后一个周期要射击的血量

在这个时候我已经懒得继续思考了,  直接去二分某个人射击的次数,就OK了


#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <cmath>#include <algorithm>#include <map>#define MAXN 55555#define MAXM 222222#define INF 1000000001using namespace std;int n, x, y, a;int main() {    scanf("%d%d%d", &n, &x, &y);    int g = __gcd(x, y);    x /= g;    y /= g;    for(int i = 0; i < n; i++) {        scanf("%d", &a);        a %= (x + y);        if(a == 0 || (a + 1) % (x + y) == 0) puts("Both");        else {            int flag = 0;            int low = 1, high = x;            while(low <= high) {                int mid = (low + high) >> 1;                long long tmp = (long long)mid * (long long)y;                long long z = tmp / (long long)x;                if(z + mid > a) {                    high = mid - 1;                } else if(z + mid == a) {                    flag = 1;                    break;                } else {                    low = mid + 1;                }            }            if(flag) {                puts("Vanya");            } else {                puts("Vova");            }        }    }    return 0;}



E的话

题目给出了很好的限制了

就是从x方向或者y方向,你从0开始走,走个n步,一定能遍历到所有的0~n-1

然后x方向你从0模拟走个n步,得到一个x坐标序列

y坐标也这么干

两个序列。都是可以循环的

然后你选择从某个点(x0,y0)出发

无非就是对两个序列,x序列的从x0开始,y序列从y0开始,各自走个n步,看有哪些点是符合题目要求的

再一看,发现无非就是看两个序列的相对位置了。

对所有给出的点, 算出其对应的 两个序列的相对位置,最后统计下即可


#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <cmath>#include <algorithm>#include <map>#define MAXN 55555#define MAXM 222222#define INF 1000000001using namespace std;int posx[1111111], posy[1111111];int n, m, dx, dy;int x[111111], y[111111];int num[1111111];int main() {    scanf("%d%d%d%d", &n, &m, &dx, &dy);    int now = 0;    int ind = 0;    while(posx[now] == 0) {        posx[now] = ++ind;        now = (now + dx) % n;    }    now = 0, ind = 0;    while(posy[now] == 0) {        posy[now] = ++ind;        now = (now + dy) % n;    }    int mx = 0, p = 0;    for(int i = 0; i < m; i++) {        scanf("%d%d", &x[i], &y[i]);        int px = posx[x[i]];        int py = posy[y[i]];        int t = (py - px + n) % n;        num[t]++;        if(num[t] > mx) {            mx = num[t];            p = t;        }    }    for(int i = 0; i < m; i++) {        int px = posx[x[i]];        int py = posy[y[i]];        int t = (py - px + n) % n;        if(t == p) {            printf("%d %d\n", x[i], y[i]);            break;        }    }    return 0;}



0 0
原创粉丝点击