公式

A - 倉庫の在庫管理 / Warehouse Inventory Management 解説 by physics0523


初心者の方へ


まず、各倉庫の在庫が数列 \(P_i\) として与えられるので、これをそのまま配列として受け取ります。
その後、倉庫 \(U\) から倉庫 \(V\) に在庫を \(W\) 個移動させるということを以下の通りに言い換えます。

  • 倉庫 \(U\) から在庫を \(W\) 個減らす。その後、倉庫 \(V\) に在庫を \(W\) 個増やす。

その後、以下の手続きで在庫が最大 (タイブレークは倉庫番号の小さいもの)の倉庫を求めます。

  • 最初、暫定的な解を \(x=1\) とする。
  • \(i=2,3,\dots,N\) の順に、倉庫 \(x\) より倉庫 \(i\) の方が在庫が多ければ \(x=i\) と更新することを繰り返す。

全ての操作は配列、 for ループ、 if 文の組み合わせで実現できます。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;
using ll=long long;

int main(){
  ll n,m;
  cin >> n >> m;
  vector<ll> p(n+1);
  for(ll i=1;i<=n;i++){ cin >> p[i]; }
  while(m--){
    ll u,v,w;
    cin >> u >> v >> w;
    p[u]-=w;
    p[v]+=w;
  }
  ll res=1;
  for(ll i=2;i<=n;i++){
    if(p[res] < p[i]){ res=i; }
  }
  cout << res << "\n";
  return 0;
}

投稿日時:
最終更新: