壁打ちAtCoder

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

AtCoder Beginner Contest 060 by C

AtCoder Beginner Contest 060 の問題について
C言語での回答。

できたもの

  • A
  • B
  • C

できなかったもの

  • D

問題A

#include <stdio.h>
#include <string.h>

int main(void){
    char a[11], b[11], c[11];
    scanf("%s %s %s", a, b, c);
    int long_a = strlen(a);
    int long_b = strlen(b);

    if(a[long_a-1]==b[0]&&b[long_b-1]==c[0]){
        printf("YES");
    }
    else{
        printf("NO");
    }

    return 0;
}

入力された文字
最初は配列の最後a[9]を参照していたんですが、必ずしも10文字ではないので文字列の長さを計算しています。
strlen関数は\0の前までの数を数えるので文字数とイコールです。
配列は0始まりなのでa[long_a-1]、b[long_b-1]が最後の文字列。
素数10だと10文字の時にうまくいかなかったので要素数は11です。

問題B

#include <stdio.h>

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

    int x = 1;
    for(i=1;i<1000;i++){
        if(((a*i)%b)==c){
            x = 0;
            break;
        }
        else{
            x = 1;
        }
    }

    if(x==0){
        printf("YES");
    }
    else{
        printf("NO");
    }

    return 0;
}

数値はいくつ選んでもいいが、必ずAの倍数にすることという制限があるので、総和は必ずAの整数倍です。
それをBで割ったあまりがCになるiが存在するか調べます。
範囲1000までと雑で、正直力技すぎてこれでいいのか疑問は残るのですが……
当てはまるものがあればforを抜けます。

問題C

#include <stdio.h>

int main(void){
    long long N, T, i;
    long long n[200001];

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

    long long total = T;
    for(i=1;i<N;i++){
        if(n[i]-n[i-1]<T){
            total = total + (n[i] - n[i-1]); 
        }
        else{
            total = total + T;
        }
    }

    printf("%lld", total);

    return 0;
}

i番目の人とi+1番目の人の間隔が、T秒間より短い時に秒数が短縮されます。
よってその条件に合致する場合には総和にT秒を足すのではなく、i番目とi+1番目の間隔を代わりに足します。

問題D

まだ