그리디 문제입니다.
처음엔 오름차순 정렬을 하여 차례대로 비교한 후 작은 수의 드링크를 2로 나누어 반대에 부어야 하나 생각했지만,
예제를 보니 가장 큰 수의 드링크에 나머지 모든 드링크를 2로 나누어 부으면 되는 문제였습니다.
실버 3
시간 제한 | 메모리 제한 |
---|---|
1 초 | 256 MB |
페인은 에너지 드링크를 좋아하는 회사원이다. 에너지 드링크는 카페인, 아르기닌, 타우린, 나이아신 등의 성분이 들어있어 피로 회복에 도움을 주는 에너지 보충 음료수이다.
야근을 마치고 한밤중에 퇴근하니 벌써 새벽 1시. 하지만 주말은 아직 멀었고, 다음 날에도 정시에 출근해야 하는 페인은 오늘도 에너지 드링크를 찾는다.
반복되는 야근에 지친 나머지, 평소보다 더 많은 에너지와 피로 회복이 필요했던 페인은 집에 있던 에너지 드링크들을 한 데 합쳐서, 하나의 에너지 드링크로 만들어 한번에 마시려 한다.
페인이 에너지 드링크들을 합치는 과정은 다음과 같다.
예를 들어, 두 에너지 드링크 a, b가 있고, 양이 각각 xa, xb라 할 때, 다음 둘 중 하나의 선택을 할 수 있다.
페인은 합쳐진 에너지 드링크의 양을 최대로 하려 한다. 불쌍한 페인을 도와주자!
첫째 줄에 페인이 가지고 있는 에너지 드링크의 수 N이 주어진다. (2 ≤ N ≤ 10^5)
둘째 줄에 각 에너지 드링크의 양이 공백으로 구분되어 주어진다. i번째 정수 xi (1 ≤ xi ≤ 10^9)는 에너지 드링크 i의 양이 x[i]임을 의미한다.
첫째 줄에 페인이 최대로 만들 수 있는 에너지 드링크의 양을 출력한다.
절대/상대 오차는 10^-5까지 허용한다.
5
3 2 10 9 6
20
10
100 9 77 65 39 27 45 1 80 495
716.5
숫자가 가장 큰 드링크에 나머지 드링크를 2로 나눈 후 더해주면 된다.
import sys
input = sys.stdin.readline
n = int(input())
energy = list(map(int, input().split()))
m_e = max(energy) # 가장 숫자가 큰 드링크
print(m_e + (sum(energy) - m_e) / 2) # 가장 큰 드링크를 제외한 나머지를 가장 큰 드링크에 부음