公式

B - お買い物プラン / Shopping Plan 解説 by physics0523


カテゴリーごとに最安値の店で買い物をすればよいです。
カテゴリーごとの最安値を求め、それを足し合わせることで答えが得られます。
カテゴリーの番号が \(10^9\) まであるので通常の配列で保持するとメモリ制限を超過することに注意してください。例えば C++ では map などの連想配列を利用できます。
特定のカテゴリーの品物が購入できない場合があるので、その判定も必要となることに注意してください。このようなケースでは、連想配列に特定のキー(key)が含まれるかどうかを判定する機能を用いるとよいです。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;
using ll=long long;

int main(){
  ll N,M;
  cin >> N >> M;
  vector<ll> T(N);
  for(auto &nx : T){cin >> nx;}
  map<ll,ll> mp;
  while(M--){
    ll S,C;
    cin >> S >> C;
    if(mp.find(S)==mp.end()){mp[S]=C;}
    mp[S]=min(mp[S],C);
  }

  ll res=0;
  for(auto &nx : T){
    if(mp.find(nx)==mp.end()){res=-1; break;}
    res+=mp[nx];
  }
  cout << res << "\n";
  return 0;
}

投稿日時:
最終更新: