洛谷5月月赛

Task1

n堆石子,每次可以从第i堆中取走一个当且仅当Ni > Ni-1(第0堆视作0个)。拿不了就输了。问先手赢还是后手赢。

奇偶性问题。不管如何分布,必定全部被拿完。

#include <cstdio>
inline char gc() {
    static char now[1<<16], *S, *T;
    if(S == T) {T = (S = now) + fread(now, 1, 1<<16, stdin); if(S == T) return EOF;}
    return *S++;
}
inline int read() {
    int x = 0, f = 1; char c = gc();
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = gc();}
    while(c >= '0' && c <= '9') {x = x * 10 + c - 48; c = gc();}
    return x * f;
}
int n, a[110];
int main() {
    n = read(); long long ans = 0;
    for(int i = 1; i <= n; ++i) a[i] = read();
    for(int i = 1; i <= n; ++i) ans+= a[i];
    if(ans % 2 == 1) puts("Alice");
    else puts("Bob");
    return 0;
}

Task2

可以计算得知,无论如何也不可能盖住四条边界。于是枚举四条边界的整数点即可。

#include <cstdio>
#define mo 1e-7
double x[110], y[110];
int n, l;
inline double getdis(double x1, double y1, double x2, double y2) {return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);}
int main() {
    scanf("%d%d", &n, &l);
    for(int i = 1; i <= n; ++i) scanf("%lf%lf", &x[i], &y[i]);
    for(int i = 0; i <= l; ++i) {
        int X, Y; bool flag;
        X = 0; Y = i; flag = 1;
        for(int j = 1; j <= n; ++j) {
            double dis = getdis(X, Y, x[j], y[j]);
            if(dis < (((double)l/n) + ((double)1e-6)) * (((double)l/n) + ((double)1e-6))) {flag = 0; break;}
        }
        if(flag == 1) {printf("%d %d", X, Y); return 0;}
        
        
        X = l; Y = i;
        flag = 1;
        for(int j = 1; j <= n; ++j) {
            double dis = getdis(X, Y, x[j], y[j]);
            if(dis < (((double)l/n) + ((double)1e-6)) * (((double)l/n) + ((double)1e-6))) {flag = 0; break;}
        }
        if(flag == 1) {printf("%d %d", X, Y); return 0;}
        
        
        
        X = i; Y = 0;
        flag = 1;
        for(int j = 1; j <= n; ++j) {
            double dis = getdis(X, Y, x[j], y[j]);
            if(dis < (((double)l/n) + ((double)1e-6)) * (((double)l/n) + ((double)1e-6))) {flag = 0; break;}
        }
        if(flag == 1) {printf("%d %d", X, Y); return 0;}
        
        
        
        X = i; Y = l;
        flag = 1;
        for(int j = 1; j <= n; ++j) {
            double dis = getdis(X, Y, x[j], y[j]);
            if(dis < (((double)l/n) + ((double)1e-6)) * (((double)l/n) + ((double)1e-6))) {flag = 0; break;}
        }
        if(flag == 1) {printf("%d %d", X, Y); return 0;}
        
        
        
        
    }
    puts("GG");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值