壁打ちAtCoder

AtCoderの問題をひたすら解いてくブログです。思考やコードの書き方の私的備忘録として

AtCoder Beginner Contest 070 by C

AtCoder Beginner Contest 070 について
C言語での回答

atcoder.jp


今回は調子がいいぞ!

できたもの
A
B
C

できなかったもの
D

問題A

#include <stdio.h>

int main(void){
    char n[3];
    scanf("%s", &n);

    if(n[0]==n[2]){
        printf("Yes");
    }
    else{
        printf("No");
    }

    return 0;
}

数字って書いてるけど1桁目と3桁目を比較したいんだから文字列として受け取ってやり、
str[0]とstr[2]で比較してやればおしまい。

問題B

#include <stdio.h>

int main(void){
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);

    if(c>b||d<a){
        printf("0");
    }
    else if(a<=c&&b>=d){
        printf("%d", d-c);
    }
    else if(a<=c&&b<d){
        printf("%d", b-c);
    }
    else if(a>=c&&b>=d){
        printf("%d", d-a);
    }
    else if(a>=c&&b<d){
        printf("%d", b-a);
    }


    return 0;
}

分岐条件に注意。cがaより後とは限らないのだ。
bとdの=に関しては逆にしてても同じだと思います。

問題C

#include <stdio.h>

long long gcd(long long a, long long b){
    if(b==0){
        return a;
    }
    else{
        return gcd(b, a%b);
    }
}

long long lcm2(long long a, long long b){
    long long d = gcd(a,b);
    return a/d * b;
}

int main(void){
    int n,i;
    long long t[101];
    scanf("%d", &n);

    for(i=0;i<n;i++){
        scanf("%lld", &t[i]);
    }

    long long l = t[0];
    for(i=0;i<n-1;i++){
        l = lcm2(l,t[i+1]);
    }

    printf("%lld", l);

    return 0;
}

最小公倍数を求めればOK
分からなかったのでアルゴリズムを調べました。
こちらのサイトより
https://algo-logic.info/lcm-of-array/

問題D

まだ

途中↓

#include <stdio.h>

#define num_max 100010

long long depth[num_max];

typedef struct {
    int To;
    long long Cost;
}EDGE;

EDGE tree[300030];

//頂点vから頂点Kまでの最短距離
void dfs(int v, int p, long long d){
    int i;
    depth[v] = d;
    for(i=tree[v].To;i!=-1;i++){ //<-forの範囲どうなの?
        if(tree[i].To==p){
            continue;
        }
        dfs(tree[i].To, v, d + tree[i].Cost);
    }
}

int main(void){
    int n,q,k,i;
    scanf("%d", &n);
    int a,b;
    long long c;
    int x, y;

    for(i=0;i<n-1;i++){
        scanf("%d %d %lld", &a, &b, &c);
        a--, b--;
        tree[a].To = b;
        tree[a].Cost = c;
        tree[b].To = a;
        tree[b].Cost = c;
    }

    scanf("%d %d", &q, &k);
    k--;

    dfs(k, -1, 0);

    //頂点Kからxまでとyまでの和
    for(i=0;i<q;i++){
        scanf("%d %d", &x, &y);
        x--,y--;
        printf("%lld", depth[x]+depth[y]);
    }


    
    return 0;
}

解説:
https://img.atcoder.jp/abc070/editorial.pdf

C++のコードをCに書き換えようとしているところですが、関数のループ条件がわかりません