備忘録

まとめておきたいことのメモ 主にプロコンのこと

AOJ-ICPC 1147

ICPC Score Totalizer Software | Aizu Online Judge

先に進みつつも復習もしましょうね〜ということで一番最初の問題。

最大値と最小値を除いたスコアの平均値を計算しよう、ってことですね(最初読んだ時英語を理解するのに苦労したのは秘密)

これぐらい余裕じゃと思って最初に書いたコードがこちら。

int main()
{
    int n;
    while(1){
        cin >> n;
        if(n == 0) break;
        int max = -1, min = 10000, sum = 0, score = 0, ans = 0;
        for(int i = 0; i < n; i++){
            cin >> score;
            sum += score;
            if(score > max) max = score;
            else if(score < min) min = score;
        }
        sum -= max + min;
        ans = sum / (n - 2);
        cout << ans << endl;
    }
    return 0;
}

ぱぱっと提出してみたところ…wrong answer
こんな問題も一発で通せないのかよ〜〜〜と思って見直してみる。
とりあえずtestcaseをターミナルで試してみたところ、以下の場合に引っかかった。

3
321
638
974
-41 // 答え

よくわからなかったので一回ごとに最大値、最小値を表示させるようにした。
実行したものがこちら。

3
321
321 10000
638
638 10000

minの値がうまく変わっていなかったことが判明。
どうやらelseをつけてしまったのがまずかったみたい。
確かに、elseをつけてしまったら入力された値が最大値でありかつ最小値である場合がわからなくなるもんなあ。
というわけでelseだけ取り除いたらうまく行った。

int main()
{
    int n;
    while(1){
        cin >> n;
        if(n == 0) break;
        int max = -1, min = 10000, sum = 0, score = 0, ans = 0;
        for(int i = 0; i < n; i++){
            cin >> score;
            sum += score;
            if(score > max) max = score;
            if(score < min) min = score;
        }
        sum -= max + min;
        ans = sum / (n - 2);
        cout << ans << endl;
    }
    return 0;
}

ifとelse if、気をつけないといけないなあ。