AtCoder Beginner Contest 051 by C
AtCoder Beginner Contest 051 について
C言語での回答
できたもの
A
B
できなかったもの
C
D
問題A
#include <stdio.h> int main(void){ char s[21]; int i; scanf("%s", s); for(i=0;i<19;i++){ if(i==5||i==13){ printf(" "); i++; } printf("%c", s[i]); } return 0; }
区切り文字が入る場所がわかっているので、その番号の時だけ空白を表示すればよし
問題B
手こずりました...
x,y,zはk以下であるということと、重複をカウントしてるか否かで手間取り。
x,y,zとループのi,jの関係は上の図の通り。
例えば例のK=2,S=2の場合であれば、
i=0
x=2,y=0,z=0
i=1
x=1,y=1,z=0
x=1,y=0,z=1
i=2
x=0,y=2,z=0
x=0,y=1,z=1
x=0,y=0,z=2
と全部出せます。
全部出るのに組み合わせがどうとかで3倍したり何かしたりといらんことをここでも考えて時間をくいました……。
#include <stdio.h> int main(void){ int k,s,i,j,l; scanf("%d %d", &k, &s); int x, y, z; int count = 0; if(3*k<s){ count = 0; } else if(3*k==s){ count = 1; } else{ for(i=0;i<s+1;i++){ x = s-i; if(x<=k){ for(j=0;j<i+1;j++){ y = i-j; if(y<=k){ z = j; if(z<=k){ count++; } } } } } } printf("%d", count); return 0; }
最初はx,y,zそれぞれで3重ループで総当たりをしようとしたけど絶対時間超過だなと思ってやめました。
問題C
解説の図があまりにも分かりやすすぎた。
https://img.atcoder.jp/abc051/editorial.pdf
以下はその図をそのまま力技でコードに落とし込んだもの。
もっとスマートに書く方法がないかは気になるけど。
#include <stdio.h> int main(void){ int sx,sy,tx,ty,i; scanf("%d %d %d %d", &sx, &sy, &tx, &ty); int count_x = tx-sx; int count_y = ty-sy; for(i=0;i<count_x;i++){ printf("R"); } for(i=0;i<count_y;i++){ printf("U"); } for(i=0;i<count_x;i++){ printf("L"); } for(i=0;i<count_y;i++){ printf("D"); } printf("L"); for(i=0;i<count_y+1;i++){ printf("U"); } for(i=0;i<count_x+1;i++){ printf("R"); } printf("D"); printf("R"); for(i=0;i<count_y+1;i++){ printf("D"); } for(i=0;i<count_x+1;i++){ printf("L"); } printf("U"); return 0; }
問題D
まだ