Official

C - ロープの切り分け / Cutting a Rope Editorial by kyopro_friends


必要なロープの長さが短い生徒から順に貪欲に配るのが最適です。

よって、残りのロープの長さを管理しながらロープの配布をシミュレーションすることでこの問題を解くことができます。切る回数の条件は「切る回数が高々 \(K\) 」ではなく、「ロープを配ることができる生徒数は高々 \(K+1\) 」と考えることで、最後に min をとることで対処できます。

実装例 (C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
  int n, l, k;
  cin >> n >> l >> k;
  vector<int>a(n);
  for(int i=0; i<n; i++) cin >> a[i];
  sort(a.begin(), a.end());

  int pos = 0;
  while(pos < n && a[pos] <= l){
    l -= a[pos];
    pos++;
  }
  cout << min(pos, k+1) << endl;
}

実装例 (Python)

N, L, K = map(int, input().split())
A = list(map(int, input().split()))
A.sort()

pos = 0
while pos < N and A[pos] <= L:
  L -= A[pos]
  pos += 1

print(min(pos, K+1))

posted:
last update: