※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts