公式

B - Pepper Addiction 解説 by physics0523


コショウの種類ごとに整理します。

  • 「料理にかけられる種類 \(k\) のコショウの上限」の合計を \(s_k\) とします。
  • \(s_k \le C_k\) であれば、種類 \(k\) のコショウは最大で \(s_k\) g しかかけられない。
  • \(s_k > C_k\) であれば、種類 \(k\) のコショウは最大で \(C_k\) g しかかけられない。

なお、この上限を達成するコショウのかけ方は明らかに存在します (例えば、料理番号の若い方からコショウをかけられるだけかければよいです)。

すると、この問題でやるべきことは以下のようになります。

  • \(s_k\) をコショウの種類ごとに求める。
  • コショウの種類ごとに上で示した上限値を足し合わせる。

\(s_k\) はバケットソートの要領で求めることができ、コショウの種類ごとに上限を足し合わせる行為はforループによって実現可能です。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int n,m;
  cin >> n >> m;
  vector<int> c(m+1);
  vector<int> s(m+1,0);
  for(int i=1;i<=m;i++){
    cin >> c[i];
  }
  for(int i=0;i<n;i++){
    int a,b;
    cin >> a >> b;
    s[a]+=b;
  }
  int res=0;
  for(int i=1;i<=m;i++){
    res+=min(c[i],s[i]);
  }
  cout << res << "\n";
  return 0;
}

投稿日時:
最終更新: