문제 : https://algospot.com/judge/problem/read/MATCHORDER
알고리즘 문제 해결 전략 p. 371
책을 참고하지 않고 코드를 작성함
[알고리즘 STEP. 1]
러시아 선수들을 실력이 낮은 순에서 높은 순으로 정렬한 후에, 우리의 선수들로 이길 수 있는 가장 실력이 높은 순서까지만 이기면 된다.
일단 문제에서 주어진 선수들의 실력을 정렬하자.
러시아 | 1900 | 2200 | 2500 | 2700 | 2800 | 3000 |
한국 | 1800 | 2000 | 2600 | 2750 | 2800 | 2995 |
한국의 1800선수로는 1900선수를 이길 수 없다. 1800 선수는 아무도 이길 수 없으므로 제일 잘하는 사람이랑 붙어서 지든 말든 상관이 없다.
그럼 일단 러시아 1900 선수는 한국 2000선수와 매칭시켜서 이기도록 하자
그 다음 러시아 2200 선수는 2600선수로,
2500 선수는 2750 선수로
2700 선수는 2800 선수로
2800 선수는 2995 선수로 이긴다면, 우리는 총 4경기를 이길 수 있다.
이런 식으로, 지금 가진 선수 중 다음번 러시아 선수를 이길 수 있으면서 실력이 가장 안좋은 선수를 붙게 하면, 최대한으로 이길 수 있다.
*int play(int r, int k)
선수들이 실력순으로 나열되어 있을 때, 가장 못하는 러시아 선수 (russia[r])을 이길 수 있는 한국선수를 찾는다.
이길 수 있다면 승리횟수에 1을 더해서 반환하고, 러시아 선수와 한국 선수는 그 다음으로 잘하는 선수들을 다시 비교하게 된다.
if(korea[k]>= russia[r])
return 1+play(r+1, k+1);
else
return play(r, k+1);
순서가 뒤죽박죽 되는건 나중에 러시아 선수에 맞춰 한국 선수들을 재 정렬하면 되니깐 상관 없다.
어차피 문제에서 요구하지도 않고 있다. 그냥 이긴 횟수만 구하면 된다.
[최종 코드]
#include <iostream> } |
'알고리즘' 카테고리의 다른 글
algospot :: STRJOIN 문자열 합치기 (0) | 2017.10.17 |
---|---|
algospot :: LUNCHBOX 도시락 데우기 (0) | 2017.10.17 |
그리디 알고리즘 (탐욕법, Greedy Algorithm) (0) | 2017.10.17 |
algospot :: NUMBERGAME 숫자게임 (0) | 2017.10.17 |
algospot :: RESTORE 실험 데이터 복구하기 (0) | 2017.10.17 |