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;
}