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
まだ