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
");
        }else if(a[s%(aa+b)]==1){
            printf("Vova
");
        }else printf("Both
");
    }
}
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
", ansx, ansy);
    }
}
View Code
原文地址:https://www.cnblogs.com/icodefive/p/4179532.html