문제 풀이

 

입력 범위가 최대 1000이라 다양한 방법이 있을 수 있다.

 

다솜이가 국회위원으로 뽑히려면 최소한 모든 투표보다는 +1 커야 한다.

3 3 3 3 3 이라면 다솜이는 최소한으로 1명을 꼬셔야 한다는 것이다.

 

3 3 4 7 5 3 이라면?

제일 많은 득표수를 가진 7에게서 3번 뺏으면? 다솜이가 당선된다.

하지만 다른 방법으로도 당선될 수도 있다.

 

어떻게 하면 최소한으로 뽑을 수 있을까?

제일 많은 득표수를 가진 사람부터 빼앗으면 된다.

 

[3 3 4 7 5 3] 를 통해서 확인해보자.

 

다솜이가 3개의 득표 수고, 나머지 국회위원들 3 4 7 5 3 중에서 가장 많은 득표수를 가진 사람은 7표이므로

7 -> 6표로 깎아주고, 다솜이는 3 -> 4표로 증가시켜준다.

 

다솜이가 4개의 득표수고, 나머지 국회위원들 3 4 6 5 3 중에서 가장 많은 득표수를 가진 사람은 6표이므로

6 -> 5표로 깎아주고, 다솜이는 4 -> 5표로 증가시켜준다.

 

다솜이가 5개의 득표수고, 나머지 국회위원들 3 4 5 5 3 중에서 가장 많은 득표수를 가진 사람은 5표이므로

5 -> 6표로 깎아주고, 다솜이는 5 -> 6표로 증가시켜준다.

 

이렇게 하면 3개의 표만 뺏어오면 다솜이가 당선되게 된다.

 

가장 많은 득표수를 빠르게 구할 수 있는 연산은 다양하지만, 우선순위 큐(최대 힙) 구조를 이용하면 쉽게 해결할 수 있다.

 

소스 코드

 

#include <iostream>
#include <queue>

using namespace std;

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	int n, dasom;
	cin >> n;
	priority_queue<int> pq;
	for (int i = 0; i < n; i++)
	{
		int x;
		cin >> x;
		if (i == 0)
			dasom = x;
		else
			pq.push(x);
	}

	int ans = 0;
	while (!pq.empty())
	{
		int now = pq.top();
		pq.pop();

		if (dasom <= now)
		{
			dasom++;
			now--;
			ans++;
			pq.push(now);
		}
		else
			break;
	}

	cout << ans << endl;
	return 0;
}

'Algorithm' 카테고리의 다른 글

[백준 15903] 카드 합체 놀이  (0) 2021.10.13
[백준 14235] 크리스마스 선물  (0) 2021.10.13
[백준 2075] N번째 큰 수  (0) 2021.10.13
[백준 16926] 배열 돌리기1  (0) 2021.10.12
[백준 17298] 오큰수  (0) 2021.10.11

+ Recent posts