※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 19358번 문제인 Waiter's Problem이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/19358
가장 많은 팁을 주는 사람부터 대접하는 것이 항상 최선이다.
\(k\)번째(0-indexed)로 대접한 손님에게 받는 "초기 팁보다 적게 받은 금액"은 \(k\)와 "초기 팁" 두 값중 작은 값과 같다. 이 점을 상기하면 큰 \(k\)값에 작은 "초기 팁" 값을 대응시키는 것이 최적의 전략이 됨을 어렵지 않게 확인할 수 있다. (증명을 원한다면 exchange argument를 활용하자)
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int N;
int A[100000];
void solve() {
cin >> N;
for (int i = 0; i < N; i++) cin >> A[i];
sort(A, A + N, greater<>());
ll ans = 0;
for (int i = 0; i < N; i++) {
ans += max(A[i] - i, 0);
}
cout << ans << '\n';
}
int T;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> T;
while (T--) solve();
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 14953 // C++] Game Map (0) | 2024.07.31 |
---|---|
[BOJ 25328 // C++] 문자열 집합 조합하기 (0) | 2024.07.30 |
[BOJ 14943 // C++] 벼룩 시장 (0) | 2024.07.28 |
[BOJ 31115 // C++] Graph Theory (0) | 2024.07.27 |
[BOJ 26862 // C++] Maxdifficent Group (0) | 2024.07.26 |