問題
問題文
ある合宿におやつとしてチョコレートが何個か準備されました。合宿は $N$ 人が参加して $D$ 日間行われました。$i$ 人目の参加者 $(1 \le i \le N)$ は合宿の $1,A_i
+1,2A_i+1,\ldots$ 日目にチョコレートを $1$ 個ずつ食べました。その結果、合宿終了後に残っていたチョコレートは $X$ 個となりました。また、合宿の参加者以外がチョコレートを食べることはありませんでした。
合宿開始前に準備されていたチョコレートの個数を求めてください。
制約
・$1 \le N \le 100$
・$1 \le D \le 100$
・$1 \le X \le 100$
・$1 \le A_i \le 100~(1 \le i \le N)$
収録されている問題セット
回答
回答1 (AC)
$i$ 人目の参加者は合宿の $1,A_i+1,2A_i+1,\ldots$ 日目にチョコレートを $1$ 個ずつ食べるので、合宿全体で食べたチョコレートの個数は $\lceil D/A_i \rceil$ 個となります。ここで $\lceil x \rceil$ は実数 $x$ の小数点切り上げを表します (天井関数)。この個数を $i$ について合計すれば全員が食べたチョコレートの合計数になるので、合宿開始前に準備されていたチョコレートの個数はこれに $X$ 個を加えた個数となります。コードは以下のようになりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, d, x;
cin >> n >> d >> x;
vector<int> a(n);
for ( int i=0; i<n; i++ ) {
cin >> a.at(i);
}
int eaten = 0;
for ( int i=0; i<n; i++ ) {
eaten += ceil((float)d/a.at(i));
}
cout << x+eaten << endl;
}
回答2 (AC)
回答1のコードをちょっとだけ改良します。改良1のコードは i に関するループが2回ありますが、今回はまとめることが可能です。コードは以下のようになりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, d, x;
cin >> n >> d >> x;
int a;
for ( int i=0; i<n; i++ ) {
cin >> a;
x += ceil((float)d/a);
}
cout << x << endl;
}
調べたこと
AtCoder の解説 → コンテスト全体の解説
回答1と同じ方針でした。
リンク
前後の記事
- 前の記事 → AtCoderログ:0119 - ABC 219 B