【AtCoder】ABC 448 B - Pepper Addiction

B - Pepper Addictionatcoder.jp favicon

実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 68 / NoviSteps: 5Q / 配点: 200 点

問題概要

MM 種類のコショウがレストランに置いてあり、種類 jj のコショウは Cj[g]C_j \mathrm{\, [g]} ある。

高橋君はこの店で NN 個の料理を注文した。 相性の都合で ii 番目の料理には種類 AiA_i のコショウしかかけることができず、 ii 番目の料理にかけられるコショウの量の上限は Bi[g]B_i \mathrm{\, [g]} である。 なお、種類 jj のコショウを合計 Cj[g]C_j \mathrm{\, [g]} を超えてかけることはできない。

高橋君が料理にかけたコショウの量の合計を最大にしようとするとき、合計何 g\mathrm{g} のコショウを料理にかけることができるか求めよ。

制約

  • 入力は全て整数
  • 1N,M10001 \le N,M \le 1000
  • 1AiM1 \le A_i \le M
  • 1Bi,Ci1061 \le B_i,C_i \le 10^6

考察

料理 ii について、かけることのできるコショウの最大量は vi=min(Bi,CAi)v_i = \min(B_i, C_{A_i}) である。

したがって、全ての料理に対して viv_i を求めて合計すればよい。

ただし、料理 iivi[g]v_i \mathrm{\, [g]} のコショウをかけたとき、残りのコショウの量を CAiCAiviC_{A_i} \leftarrow C_{A_i} - v_i と更新しておくことを忘れないようにする。

実装例

CPP
1.#include <bits/stdc++.h>
2.using namespace std;
3.
4.#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)
5.
6.// ======================================== //
7.
8.int main()
9.{
10. int N, M;
11. cin >> N >> M;
12. vector<int> C(M);
13. rep(i, 0, M) cin >> C[i];
14. vector<int> A(N), B(N);
15. rep(i, 0, N) cin >> A[i] >> B[i], A[i]--;
16.
17. int ans = 0;
18. rep(i, 0, N)
19. {
20. int v = min(B[i], C[A[i]]);
21. ans += v;
22. C[A[i]] -= v;
23. }
24.
25. cout << ans << endl;
26.
27. return 0;
28.}
Submission #73892508 - AtCoder Beginner Contest 448atcoder.jp favicon

実装時間: 5 分

コメント

問題文に妙にストーリ性があって、AWCの問題かと思った。