首页 > 代码库 > Codeforces Round #280 (Div. 2)

Codeforces Round #280 (Div. 2)

a.水

b.n长度的街道有m个路灯,给出每个路灯的位置,求灯光能覆盖所有地方的最小灯光半径,水;

c.小明有n们课程要达到一个规定的总分数,一直目前每科达到的分数和每科的总分,买每门课程分数所需费用给出,问最少得花多少钱;贪心,水;

d.两个人刷怪,问谁能给出最后一击,给出怪物的血量,小明每1/m秒出击一次,小红1/n秒出击一次;

由于m,n<=1000000怪物血量<=1000000000

先打表一秒内两人对m+n以内的血的出击情况,暴力就行,但用double存会wa所以用分数存

能知道每秒两人造成的伤害为m+n,那么用a[怪物血量%(m+n)]就是答案

技术分享
#include<iostream>#include<stdio.h>#include<string.h>using namespace std;const long long maxa = 2000005;long long a[maxa];long long ss(long long suma, long long a, long long sumb, long long b){    if(suma * b > sumb * a){        return 1;    }else if(suma * b < sumb * a){        return 0;    }else return 2;}int main(){    long long n,  aa, b;    cin>>n>>aa>>b;    long long sumx = 0, sumy = 0;    for(long long i = 1; i <= aa+b; i++){        long long u = ss(sumx+1,aa,sumy+1,b);        //printf("%d ", u);        if(u == 0){            sumx ++;            a[i] = 0;        }else if(u == 1){            sumy ++;            a[i] = 1;        }else{            sumx ++;sumy ++;            a[i++] = 2;            a[i] = 2;        }    }    a[0] = a[aa+b];    while(n--){        long long s;        cin>>s;        if(a[s%(aa+b)] == 0){            printf("Vanya\n");        }else if(a[s%(aa+b)]==1){            printf("Vova\n");        }else printf("Both\n");    }}
View Code

e.有n*n的期盼每个位置的下个位置为(x+dx,y+dy),dx,dy与n互质给出m个点求从哪一点出发走的路径包含最多的点,又扩展欧几里得可知a*x+b*y所经历最小正值为gcd(a,b)

由题意可知gcd(a,b) = 1;所以每个点都会走n个不同点(x和y均不重复)后回到原点,打表出任一点的路径情况,吗,每条路径都不会有重复的点并且平行所以(a[x]+n-y)相同的点必定在一条路径上

技术分享
#include<iostream>#include<string.h>#include<stdio.h>using namespace std;const int maxa = 1000005;int a[maxa];int b[maxa];int main(){    int n, m, p, q;    while(cin>>n>>m>>p>>q){        int u= 0, v= 0;        for(int i = 0; i < n; i++){            a[u] = v;            u = (u + p) % n;            v = (v + q) % n;        }        int ansx, ansy;        int maxn = 0;        for(int i = 0 ; i < m;i++){            int x, y;            scanf("%d%d", &x, &y);            b[(a[x]+n-y)%n] ++;            if(b[(a[x]+n-y)%n] > maxn){                maxn = b[(a[x]+n-y)%n];                ansx = x;                ansy = y;            }        }        printf("%d %d\n", ansx, ansy);    }}
View Code

 

Codeforces Round #280 (Div. 2)