728x90
https://www.acmicpc.net/problem/20115
20115번: 에너지 드링크
페인은 에너지 드링크를 좋아하는 회사원이다. 에너지 드링크는 카페인, 아르기닌, 타우린, 나이아신 등의 성분이 들어있어 피로 회복에 도움을 주는 에너지 보충 음료수이다. 야근을 마치고 한
www.acmicpc.net
구현에서 문제가 발생;;
접근 방법
a = a + (b / 2) 을 통해 마지막 남은 드링크의 양이 최대가 되어야 한다.
b/2되는 부분이 최소가 되어야 버려지는 양이 적기 때문에
a: 양이 많은 것
b: 양이 가장 적은 것
이런 식으로 생각함.
1차 시도
vector 2개 v1과 v2를 만듬.
v2에 가장 큰 것 + (가장 작은 것 / 2)를 넣고, 추후 나머지도 넣는 방식으로 진행함.
sort 알고리즘을 사용했기 때문에
O(n^2*nlogn) 이기 때문에 당연하게 시간초과가 뜬다..
2차 시도
deque를 이용하면 나머지를 넣는 작업을 하지 않아도 되기 때문에 이를 이용하기로 함.
deque의 size가 1일 동안 진행하였지만 이 또한 sort를 사용하기 때문에
O(n*nlogn)이 소요된다.
정답
생각을 해보니, 가장 큰 것은 항상 고정된다.
처음에 선택한 큰 것에 계속해서 음료를 더하기 때문에 작아질 수 없기 때문!!!
따라서, 초기에 sort 한 번 수행후, for문 하나로 전부 더해 버릴 수 있다!!
#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
using namespace std;
int n;
vector<double> v;
bool cmp(double a, double b) {
return a > b;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
double tmp;
cin >> tmp;
v.push_back(tmp);
}
sort(v.begin(), v.end(), cmp);
for (int i = n-1; i > 0; i--) {
v[0] = v[0] + (v[i] / 2);
}
cout << v[0];
}
멍청한 청년..

728x90
'📊알고리즘 > BOJ' 카테고리의 다른 글
[그리디 #12] BOJ 20365 - 블로그2 (0) | 2024.02.13 |
---|---|
[그리디 #11] BOJ 20300 - 서강근육맨 (0) | 2024.02.12 |
[그리디 #9] BOJ 11508 - 2+1 세일 (0) | 2024.02.11 |
[그리디 #8] BOJ 1758 - 알바생 강호 (0) | 2024.02.11 |
[그리디 #7] BOJ 13305 - 주유소 (0) | 2024.02.10 |