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構文で回す方針が早速使えたので、少し成長したように思える。