
가격당 포만감이 가장 높은 과일 종류 순으로 과일 조각을 구매했을 때, 최대 포만감을 계산한다.
p일 때 과일을 p 조각낼 수 있으므로, 가격과 과일 조각의 최대 개수가 동일하다.그리디
1 N, K = map(int, input().split())
2 fruits = [0] * N
3 for i in range(N):
4 P, C = map(int, input().split())
5 fruits[i] = (C // P, P)
6 fruits.sort(reverse=True)
7
8 fullness = 0
9 for c, p in fruits:
10 cnt = min(K, p)
11 fullness += c * cnt
12 K -= cnt
13 if K == 0:
14 break
15
16 print(fullness)
과일의 개수 N과 예산 K을 입력받는다.
fruits에 (가격당 포만감 C // P, 가격 P)을 저장한다.
가격당 포만감을 기준으로 fruits를 내림차순으로 정렬한다.
포만감 총합을 기록할 fullness를 0으로 초기화한다.
가격당 포만감이 큰 과일 순서대로 구매한다.
현재 남은 예산 K과 과일 조각의 최대 개수 p 중 작은 개수를 구매가능한 개수 cnt에 저장한다.
가격당 포만감 * 구매가능한 개수를 포만감 총합 fullness에 더한다.
구매가능한 개수만큼 예산을 사용했으므로, 예산의 남은 양을 업데이트한다.
현재 남은 예산 K가 0이면, for문을 종료하여 과일 구매를 중단한다.
포만감 총합 fullness를 출력한다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N;
long K;
cin >> N >> K;
pair<long, long> fruits[1000];
for (int i = 0; i < N; i++) {
long price, fullness;
cin >> price >> fullness;
fruits[i].first = fullness / price;
fruits[i].second = price;
}
sort(fruits, fruits + N);
long long total_fullness = 0;
for (int i = N - 1; i >= 0; i--){
long cnt = min(K, fruits[i].second);
total_fullness += fruits[i].first * cnt;
K -= cnt;
if (K == 0) {
break;
}
}
cout << total_fullness;
return 0;
}
