알고리즘 문제풀이/백준
[백준 1758번] 알바생 강호
슥지니
2023. 4. 19. 20:50
반응형
문제 링크: https://www.acmicpc.net/problem/1758
1758번: 알바생 강호
첫째 줄에 스타박스 앞에 서 있는 사람의 수 N이 주어진다. N은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 총 N개의 줄에 각 사람이 주려고 하는 팁이 주어진다. 팁은 100,000보다 작거나 같
www.acmicpc.net
<문제 풀이> 그리디, 정렬 알고리즘
팁 - (받은 등수 - 1)
위 식을 계산했을 때 0보다 작은 경우는 팁을 누적하지 않습니다.
전체 팁의 합을 최댓값으로 만드는 최적의 해는 사람을 배치할 때 팁을 적게 주는 사람을 최대한 뒤로 보내는 것입니다.
예를 들어
50원을 주는 사람이 1등이고, 10원을 주는 사람이 100등이라고 할 때 팁은 다음과 같이 계산됩니다.
50 - (1 - 1) = 50
10 -(100 -1 ) = 0
총 팁 : 50
50원을 주는 사람을 100등, 10원을 주는 사람을 1등이라고 할 때 팁은 다음과 같이 계산됩니다.
50 - (100 - 1) == 0
10 - (1 - 1) = 10
총 팁: 10
위 예시를 보면 뒤에 오는 사람은 식의 값이 0보다 작게 되어서 팁을 누적하지 않습니다.
둘 중에 한 명의 팁을 누적하지 않을 거라면 최대한 팁을 적게 주는 사람을 뒤로 보내 누적하지 않는 것이 최적의 해가 되는 것을 알 수 있습니다.
따라서 팁을 기준으로 내림차순 정렬한 뒤 식의 값을 누적하면 됩니다.
<C++소스코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
typedef long long ll;
int seq[100001];
int main() {
ios_base::sync_with_stdio(false);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> seq[i];
}
sort(seq, seq + n, greater<int>());
ll ans = 0;
for (int i = 0; i < n; i++) {
int m = seq[i] - i;
if (m < 0) continue;
ans += m;
}
cout << ans;
return 0;
}
|
cs |
반응형