AtCoder Beginner Contest 086 - AtCoder
C問題が解けた。地味に嬉しい。 D問題は諦め。「絶望を贈ろうか」
現在地:
解けた問題と解説
解けた問題は、A,B,C。Cは最初諦めかけてた。
if文で頑張っていたらタイムオーバーになる気がしたので。
Aの回答はこちら: Submission #1999098 - AtCoder Beginner Contest 086
//#include <iostream> #include <stdio.h> int main(void) { // input int a,b; scanf("%d %d",&a,&b); // output if( ((a*b)%2) <= 0 ){ printf("Even"); } else { printf("Odd"); } return 0; }
C言語にしてしまった。
C++でコンパイルするのと、Cでコンパイルするのとではコード長が違ったので、良い方を選んだ結果。
偶数か奇数かを分けるのは、2の倍数かどうか、逆に言うと、2で割り切れるかどうか。
なので、単純に積に2で割った余りがあるかどうかで判別。
0割り考えていなかった…。 この場合、結果は"Even"になる。
Bはこちら: Submission #2000727 - AtCoder Beginner Contest 086
//#include <iostream> #include <stdio.h> #include <math.h> int main(void) { char a[8],b[4]; float x; // input scanf("%s %s",a,b); strcat(a,b); x = atoi(a); x = sqrt(x); // output if( (x-(int)x) <= 0 ){ printf("Yes"); } else { printf("No"); } return 0; }
順番的に、
1. 文字列として読み込む
2. 文字列をくっつける(strcat()
)
3. くっつけた文字列を数値に変換(atoi()
)
4. 変換した数値の平方根を吐き出す(sqrt()
)
5. 吐き出した数値から小数点以下のみをとりだし、小数点以下がなければ平方数
という流れ。
C問題は、最初はWA : Submission #2002591 - AtCoder Beginner Contest 086
その次はAC: Submission #2002941 - AtCoder Beginner Contest 086
//#include <iostream> #include <stdio.h> #include <math.h> typedef long TYPE; TYPE N,x,y,t,i,T,X,Y,mv,mt; int main(void) { T = X = Y = 0; // input scanf("%d",&N); for(i=0;i<N;++i){ scanf("%d %d %d",&t,&x,&y); mt = t - T; mv = abs(x-X) + abs(y-Y); if(mt-mv<0){ printf("No"); return 0; } if((mt-mv)%2>0) { printf("No"); return 0; } X = x; Y = y; T = t; } // output printf("Yes"); return 0; }
解き方は
1. とりあえず目的地まで行く
2. まだ歩数が余っていたら、何処か往復してゴールに戻ってこれるのかを確認する
目的地に行く方法は何でもいいが、少なくともXにいくつ、Yにいくつ移動する必要があるかを知らなければならない。このXにいくつ、Yにいくつを足せば、何秒で目的地につくかがわかる。
問題は、余ったとき。
例題にヒントがあった。一度ゴールについたあと、もとの道にもどり、再びゴール地点に戻っている。
つまり、余った分で往復できるのかを調べればいい。 というわけで、余った数が偶数なのかを判定している。