u_sho競プロぶろぐ

21歳。みゃーくぴとぅ。ゆる~く続けますたぶん。  デザイン変えました(2019/2/25)これでいきます

AtCoder Regular Contest 075 C - Bugged

 AtCoderのC埋め3問目。ABC063 / ARC075 のC問題「Bugged」(蠅ではない)。
 N個の自然数s[i]がもらえるので、それを全部足したやつが答えなんですが、ここでBugが起きます。なんと答えが10の倍数だと0扱いされてしまうのです。なので、答えが10の倍数にならないためにはどのs[i]を「答えに足さない」かということを考えましょう。

#include <iostream>
#include <algorithm>
using namespace std;

int main(void){
    int N, ans = 0;
    cin >> N;
    int s[N];
    for(int i=0; i<N; i++){
        cin >> s[i];
        ans += s[i];
    }

    if(ans%10==0){
        sort(s, s+N);
        for(int i=0; i<N; i++){
            if(s[i]%10){
                ans -= s[i];
                break;
            }
        }
    }

    if(ans%10==0) ans = 0;

    cout << ans << endl;

    return 0;
}

 とりあえずansに全部足して、それが10の倍数だと、s[i]が10の倍数かどうかを小さいやつから順にみていって、10の倍数でなければ、そいつをansから引いてあげればOK。と思ったんですが、sの全部が10の倍数のときはどうやっても0なので、その場合をしっかり考えて、if(ans%10==0) ans = 0; の一文を付け加えてあげるとACです。(こういう問題を一発で通せるようにならなければ・・・)

 という問題でした。ちゃお~。

 と思ったけど、sort(s, s+N); が初出でした。これはalgorithmライブラリをincludeしてあげてから使います。sortはvoid(値を返さない)型の関数で、sort(ポインタA, ポインタB) とやると、ポインタAからポインタBが(確保されていれば)入っている数値の小さい順に並べかえられます(ポインタよくわかんない人は「ポインタ 配列」とかでググってください)。
 そんぐらいの関数は自分で書けよと思ったでしょ。いやまあそうなんだけどね。実はソートには色々あって、それぞれ計算量が違うので、常に適切なソートを書くのは大変なのよ。その点、計算量が多くともO(NlogN) (Nは要素数)に最適化されるsort関数は便利なのね。もっと便利に使えるんだけど、それはまたの機会に。

 今度こそちゃお~。