AtCoder Beginner Contest 198 游记

PB 了。

A

水题

B

水题

C

给定坐标 (x,y)(x, y), 每次只能跳 rr, 从 (0,0)(0, 0) 跳到其要多少?

稍加观察就可以发现,就是距离除一下然后上取整就好了,因为越过的直接把前面一个弯一下就即可。

然后顺利地 WA 了。

一直以为是精度问题,最后发现是一次就跳到的要特判。

WA 了 55 次,罚时吃饱。

#include <cstdio>
#include <cmath>
int r, x, y;
int main() {
    scanf("%d%d%d", &r, &x, &y);
    double dis = sqrt((double)x*x + (double)y*y);
    double ans = ceil(dis / (double)r);
    if(ans == 1 && ceil(dis / (double)r) != floor(dis / (double)r)) ans++;
    printf("%.0lf", ans);
}

D

一看数据范围,直接搜索就可以了。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#define int long long
char s[4][15];
int len[4], num[256];
bool vis[15];
void dfs(int l, int t, int n1, int n2, int n3) {
    if(l == 3 && t > len[3]) {
        if(n1 + n2 == n3) {
            printf("%lld\n%lld\n%lld", n1, n2, n3);
            exit(0);
        }
        return;
    }
    if(t > len[l]) {
        dfs(l+1, 1, n1, n2, n3);
        return ;
    } 
    if(num[s[l][t]] != -1) {
        if(l == 1) dfs(l, t+1, n1*10+num[s[l][t]], n2, n3);
        if(l == 2) dfs(l, t+1, n1, n2*10+num[s[l][t]], n3);
        if(l == 3) dfs(l, t+1, n1, n2, n3*10+num[s[l][t]]);
        return ;
    }
    for(int i = 0; i <= 9; i++) {
        if(t == 1 && i == 0) continue;
        if(vis[i]) continue;
        num[s[l][t]] = i;
        vis[i] = 1;
        if(l == 1) dfs(l, t+1, n1*10+i, n2, n3);
        if(l == 2) dfs(l, t+1, n1, n2*10+i, n3);
        if(l == 3) dfs(l, t+1, n1, n2, n3*10+i);
        vis[i] = 0;
        num[s[l][t]] = -1;
    }
}
signed main() {
    scanf("%s%s%s", s[1]+1, s[2]+1, s[3]+1);
    for(int i = 1; i <= 3; i++) 
        len[i] = strlen(s[i]+1);
    memset(num, -1, sizeof num);
    dfs(1, 1, 0, 0, 0);
    printf("UNSOLVABLE");
    return 0;
}

E

今天 E 那么水???

达成 PB, Rank 575, 本来还可以更高的。