Official

D - お土産の配布 / Distribution of Souvenirs Editorial by physics0523


各種のお菓子について、 \(N\) 個を超えて配ることはできません。
よって、配布できるお菓子の数は高々 \(s=\sum_{i=1}^{M} \min(C_i,N)\) 個です。
そして、 \(s \ge KN\) であれば必ず問題文の条件を満たすお菓子の配り方をすることができます。方法は次の通りです。

  • お菓子を種類順に並べた列を \(L\) とする。
  • \(L\) の要素を順に人 \(1,2,\dots,N-1,N,1,2,\dots\) に配布する。

こうすることで、同じ種類のお菓子が \(N+1\) 個以上ない限り各人が受け取るお菓子の種類が重複することがないようにできます。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;
using ll=long long;

int main(){
  ll N,M,K;
  cin >> N >> M >> K;
  ll s=0;
  for(ll i=0;i<M;i++){
    ll C;
    cin >> C;
    s+=min(C,N);
  }
  if(s>=N*K){
    cout << "Yes\n";
  }
  else{
    cout << "No\n";
  }
  return 0;
}

posted:
last update: