ABC#13

AtCoder Beginner Contest #013 に参加しました。

寝てたので、解き始めたのは開始時間の1時間後の22時から。

以下、結果報告。

A. A

見た感じ、問題の制約的に、全部のパターンで条件分岐してもTLEにはならないだろうと予想したので、取り敢えずその方針で進めた。

#include <stdio.h>

int main(void)
{
    char a;
    scanf("%c", &a);
    
    if ( a == 'A' ) {
        puts("1");
    }
    if ( a == 'B' ) {
        puts("2");
    }
    if ( a == 'C' ) {
        puts("3");
    }
    if ( a == 'D' ) {
        puts("4");
    }
    if ( a == 'E' ) {
        puts("5");
    }
    
    return 0;
}

一応、一発で通り、3分41秒でAC。 今回は、条件がA-Eだったが、これがA-Zとなると、この方針ではコードが長くなりすぎてしまうので、

#include <stdio.h>

int main(void)
{
    char s[100] = "ABCDE";
    char a;
    int res, k;
    
    scanf("%c", &a);
    
    for ( k = 0; k < 5; k++ ) {
        if ( s[k] == a ) {
            res = k+1;
        }
    }
    
    printf("%d\n", res);
    
    return 0;
}

このように、ループを回すことで簡潔に書ける。なるほどなぁ。

B. 鍵

ダイヤルロック鍵の問題。aとbの絶対値を取れば、簡潔に書けるのではないかと予想。

#include <stdio.h>
#include <math.h>

int main(void)
{
    int a, b;
    int c;
    
    scanf("%d%d", &a,&b);
    
    if ( abs(a-b) <= 5 ) {
        c = abs(a-b);
    }
    if ( a > b && abs(a-b) >= 5 ) {
        c = (10-a)+b;
    }
    if ( a < b && abs(a-b) >= 5 ) {
        c = (10-b)+a;
    }

    printf("%d\n", c);
    
    return 0;
}

色々と条件を見と落としていた所為で、4回ぐらいWAを出してしまった。

なんとか、31分52秒でAC。残り時間30分弱。

もっと簡潔な書き方としては、絶対値の差と(10-絶対値の差)の最小値を求めれば良いらしい。

C++のmin関数を使えば楽に実装できそう。

C. 節制

取り敢えず、問題に目を通してみる。

問題自体は理解したものの、実装方法が思いつかず、ここで終了時間となった。

全探索すれば、部分点は貰えるらしいが、それすら思いつかなかったので、まだまだ勉強不足であると実感した。

解説を読んで理解。時間があるときに自分でコードを書いてみようと思う。

D. 阿弥陀

問題にすら目を通せなかったが、一応解説を読んでみた。

阿弥陀くじは、全単射(1対1対応)なので、n!でループするらしい。

途中、ダブリングという聞きなれないワードが出てきたが、頻出の解法らしい。

問題をグラフ化することである程度理解することは出来たが、それを実装できるかどうかは怪しい。今度挑戦してみようと思う。

総評

AtCoderプログラミングコンテストに参加したのは、今回が初めてだったが、半分の時間でB問題まで解けたのでまずまずの結果では無いかと思う。

今後の課題としては、簡単な問題で、いかに簡潔なコードを書くという点と、C問題以降が解けるように様々なアルゴリズムを学ぶという点である。

次回は、8月20日の20時からCode Formula 予選A、8月23日の21時から天下一プログラマーコンテスト2014 予選Bが開催されるので、都合が合えば参加したい所存である。