[C++] 20115번: 에너지 드링크

2023. 7. 15. 04:56·[게임 개발] 알고리즘 공부/백준

링크

https://www.acmicpc.net/problem/20115

 

20115번: 에너지 드링크

페인은 에너지 드링크를 좋아하는 회사원이다. 에너지 드링크는 카페인, 아르기닌, 타우린, 나이아신 등의 성분이 들어있어 피로 회복에 도움을 주는 에너지 보충 음료수이다. 야근을 마치고 한

www.acmicpc.net

문제

페인은 에너지 드링크를 좋아하는 회사원이다. 에너지 드링크는 카페인, 아르기닌, 타우린, 나이아신 등의 성분이 들어있어 피로 회복에 도움을 주는 에너지 보충 음료수이다.

야근을 마치고 한밤중에 퇴근하니 벌써 새벽 1시. 하지만 주말은 아직 멀었고, 다음 날에도 정시에 출근해야 하는 페인은 오늘도 에너지 드링크를 찾는다.

반복되는 야근에 지친 나머지, 평소보다 더 많은 에너지와 피로 회복이 필요했던 페인은 집에 있던 에너지 드링크들을 한 데 합쳐서, 하나의 에너지 드링크로 만들어 한번에 마시려 한다.

페인이 에너지 드링크들을 합치는 과정은 다음과 같다.

  1. 임의의 서로 다른 두 에너지 드링크를 고른다.
  2. 한쪽 에너지 드링크를 다른 쪽 에너지 드링크에 모두 붓는다. 단, 페인은 야근 후유증으로 인해 손이 떨려, 붓는 과정에서 원래 양의 절반을 바닥에 흘리게 된다.
  3. 다 붓고 남은 빈 에너지 드링크는 버린다.
  4. 1~3 과정을 에너지 드링크가 하나만 남을 때까지 반복한다.

예를 들어, 두 에너지 드링크 a, b가 있고, 양이 각각 xa, xb라 할 때, 다음 둘 중 하나의 선택을 할 수 있다.

  • a의 양을 xa + (xb / 2)로 만들고, b를 버리기
  • b의 양을 xb + (xa / 2)로 만들고, a를 버리기

페인은 합쳐진 에너지 드링크의 양을 최대로 하려 한다. 불쌍한 페인을 도와주자!

입출력 예제

입력

첫째 줄에 페인이 가지고 있는 에너지 드링크의 수 N이 주어진다. (2 ≤ N ≤ 105)

둘째 줄에 각 에너지 드링크의 양이 공백으로 구분되어 주어진다. i번째 정수 xi (1 ≤ xi ≤ 109)는 에너지 드링크 i의 양이 xi임을 의미한다.

출력

첫째 줄에 페인이 최대로 만들 수 있는 에너지 드링크의 양을 출력한다.

절대/상대 오차는 10-5까지 허용한다.

예제 입력 1 복사
5
3 2 10 9 6
예제 출력 1 복사
20
예제 입력 2 복사
10
100 9 77 65 39 27 45 1 80 495
예제 출력 2 복사
716.5

코드

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <cmath>

using namespace std;

int main(void)
{
	vector<long long> drink;
	double result = 0;
	int n;
	cin >> n;
	
	for (int i = 0; i < n; i++)
	{
		int temp;
		cin >> temp;
		drink.push_back(temp);
	}

	sort(drink.begin(), drink.end(), greater<>());
	result = drink[0];

	for (int i = 1; i < drink.size(); i++)
	{
		result += drink[i] / 2.0;
	}

	cout << result;
}

풀이

  • 그리디 알고리즘을 이용하였다.
  • 두 개의 음료수 중 하나를 골라 그 음료의 반만 나머지 음료수에 넣는 방식이니
    최대한 음료의 손실을 적게 하기 위하여 내림차순으로 정렬을 한다.
  • 그럼 0번 인덱스에는 가장 큰 값이 있을태니 이 값에 나머지 값들의 반을 모두 넣는다.
저작자표시 (새창열림)

'[게임 개발] 알고리즘 공부 > 백준' 카테고리의 다른 글

[C++] 2872번: 우리집엔 도서관이 있어  (0) 2023.07.17
[C++] 20186번: 수 고르기  (0) 2023.07.16
[C++] 19941번: 햄버거 분배  (0) 2023.07.14
[C++] 13305번: 주유소  (0) 2023.07.14
[C++] 2012번: 등수 매기기  (0) 2023.07.14
'[게임 개발] 알고리즘 공부/백준' 카테고리의 다른 글
  • [C++] 2872번: 우리집엔 도서관이 있어
  • [C++] 20186번: 수 고르기
  • [C++] 19941번: 햄버거 분배
  • [C++] 13305번: 주유소
람팜팜~
람팜팜~
:)
  • 람팜팜~
    RumPumPum
    람팜팜~
  • 전체
    오늘
    어제
    • 전체 (123)
      • 🎵 일상 (2)
      • JAVA (5)
        • 김영한의 자바 입문 (3)
      • JavaScript (12)
      • ---------------------------.. (0)
      • [게임 개발] 포트폴리오 (2)
        • RPG (1)
        • 슈터-플랫포머 (1)
      • [게임 개발] 개발 일지 (28)
        • RPG (25)
        • TopDownProject (3)
      • [게임 개발] 언리얼엔진 공부 (9)
        • 이득우의 언리얼 프로그래밍 Part.1 (6)
        • 이득우의 언리얼 프로그래밍 Part.2 (1)
        • 개인 메모 (2)
      • [게임 개발] 알고리즘 공부 (60)
        • 프로그래머스 (8)
        • 백준 (52)
        • 개인 메모 (0)
      • [게임 개발] CPP 공부 (2)
        • 이것이 C++ 이다 (1)
        • Effective C++ (0)
        • Effective Modern C++ (0)
        • 홍정모 그래픽스 새싹코스 (1)
      • [게임 개발] CS 공부 (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      스레드
      참조자
      슬라이딩 윈도우
      데드락
      프로세스
      메모리구조
      문자열
      역참조
      dfs
      누적합
      투포인터
      해시
      그리디
      dp
      브루트포스
      context switching
      우선순위 큐
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    람팜팜~
    [C++] 20115번: 에너지 드링크
    상단으로

    티스토리툴바