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関数は便利なのね。もっと便利に使えるんだけど、それはまたの機会に。
今度こそちゃお~。