見出し画像

ABC204 B 解答

B - Nuts(9)

問題

問題文

N 本の木があり、i 番目の木には Ai 個の木の実が実っています。
シマリスは、次のルールで全ての木から木の実を収穫します。
・実っている木の実が 10 個以下の木からは木の実を収穫しない
・実っている木の実が 10 個より多い木からは、10 個を残して残りの全てを収穫する
シマリスが収穫する木の実の個数の合計を求めてください。

制約

1 ≤ N ≤ 1000
0 ≤ Ai ≤ 1000
入力に含まれる値は全て整数である

考察

ナッツを集めます。この問題はいたって素直ですね。A問題よりも良い子かもしれません。

条件は次の2つです。

1)ナッツが10個以下なら収穫しない
2)10より多ければ10個になるまで収穫

この条件をまとめますと収穫できるナッツの数は

max(0, A-10)

この式で表されます。max関数はmax(a,b)の大きいほうを出力してくれる優れものです。もし、ナッツが10個以下だったら、A-10は0以下になるので、0を出力しますが、10個よりも多い場合には、1以上ですので、収穫できるナッツの数が返ってきます。

「10個残す」というのも地味にポイントかもしれませんね。

特にオーバーフローの心配もありませんので、全ての木に対してこの計算の和を出力すれば答えが求まります。

実装

 #include <bits/stdc++.h> #define  rep(i,n) for(int i=0;i<n;++i) #define  reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;

int main()
{
   int n;
   cin >> n;
   int ans = 0;
   rep(i, n)
   {
       int a; cin >> a;
       ans += max(0,a-10);
   }
   cout << ans << endl;
   return 0;
}

あとがき

今回はmaxを使ってスマートに答えを求めましたが、もちろんif文を使って

if(A>10) ans+=A-10;

と計算して大丈夫です。コンテスト中は速くバグなく書くことがなによりも重要です。自分が得意な書き方で解きましょう。私はこの書き方で解きましたよ。

ただコンテスト後はこんな解き方もあるのかー、と別解を眺めてみると思わぬ発見があるかもしれませんね。


この記事が気に入ったらサポートをしてみませんか?