Code Formula 2014 予選A
Code Formula 2014 予選A に参加しました。
今回は、20時から22時のフルタイムでの挑戦でした。
以下、結果報告。
A. 立方数
滅茶苦茶単純な問題。しかし、最初に、三乗根を求めるプログラムを書こうとしたが、問題文の通りに素直に実装したほうが早いと思い、途中で方針を変えてしまったため、少し時間を無駄にした。
#include <stdio.h> int main(void) { int a; int k; scanf("%d", &a); for ( k = 1; k <= 100; k++ ) { if ( (k*k*k) == a ) { puts("YES"); return 0; } } puts("NO"); return 0; }
18:13で一発正答。ケアレスミスを犯してなければ10分も掛からなかったかも…
B. ボウリングゲーム
見た感じ、少し難しそう。某コンテストのセルオートマトンがふと頭を過った。
あと少しの所までは実装できたように思えるが、ここで時間切れ。以下、途中までのコード。
#include <stdio.h> int main(void) { int a, b; int i, j, k; char s[100] = "0123456789"; char p[100]; char q[100]; scanf("%d %d", &a, &b); for ( i = 0; i < a; i++ ) { scanf("%d", &p[i]); } for ( j = 0; j < b; j++ ) { scanf("%d", &q[j]); } for ( i = 0; i < a; i++ ) { for ( k = 0; k < 10; k++ ) { if ( p[i] == k ) { s[k] = '.'; } } } for ( j = 0; j < b; j++ ) { for ( k = 0; k < 10; k++ ) { if ( q[j] == k ) { s[k] = 'o'; } } } printf("%c %c %c %c\n", s[7], s[8], s[9], s[0]); printf(" %c %c %c\n", s[4], s[5], s[6]); printf(" %c %c\n", s[2], s[3]); printf(" %c\n", s[1]); return 0; }
ストライク、一回目ガター、二回目ストライクの場合のみ実装出来たが、残ったピンにx印を付けるのが実装できなかった。あと、反復係数使いすぎ。見づらい。
他の人が提出したコードを参考に、改めて挑戦してみた。
while文を使えば、反復係数が煩雑にならなくて済んだり、配列を予め、全て "x" で初期化しておき、新たな変数 "tmp" を導入することで、idの役割を持たせることが出来るのか。
他人のソースコードを読むこともかなり勉強になるので、積極的に参考にしていきたい。
#include <stdio.h> int main(void) { int a, b, tmp; char s[100] = "xxxxxxxxxx"; scanf("%d %d", &a, &b); while ( a > 0 ) { scanf("%d", &tmp); s[tmp] = '.'; a--; } while ( b > 0 ) { scanf("%d", &tmp); s[tmp] = 'o'; b--; } printf("%c %c %c %c\n", s[7], s[8], s[9], s[0]); printf(" %c %c %c\n", s[4], s[5], s[6]); printf(" %c %c\n", s[2], s[3]); printf(" %c\n", s[1]); return 0; }
C. 決勝進出者
Bを解いている合間に、一度問題に目を通してみたが、結構面倒くさそうに感じたので、引き続きB問題に取り組んだ。
あとで解説を読もう。
D. 無刻印キーボード
Cと同様に、少しだけ問題を読んでみたが、これも面倒くさそう。
解説待ち。
総評
前回のABC #13と比べると、問題の難易度が結構高かったように感じた。
B問題では、前回学習したように、予め配列に初期値を代入しておいて、それをfor構文で回す方針が早速使えたので、少し成長したように思える。