20366번 : 같이 눈사람 만들래?
문제)
언니! 똑...똑똑...똑똑! 같이 눈사람 만들래~? ♪
언니 엘자와 동생 안나에게는 N개의 눈덩이가 있다. 각 눈덩이 i (1 ≤ i ≤ N)의 지름은 Hi 이다. 하나의 눈사람은 두 개의 눈덩이로 구성되며, 눈덩이 하나를 아래에 두고 그 눈덩이보다 크지 않은 다른 눈덩이를 쌓아올리는 방식으로 만들 수 있다. 이때, 눈사람의 키는 두 눈덩이 지름의 합과 같다.
엘자와 안나는 눈덩이 N개 중 서로 다른 4개를 골라서 눈사람을 각각 1개씩, 총 2개를 만들려고 한다. 두 자매는 두 눈사람의 키의 차이가 작을수록 두 눈사람의 사이가 좋을 것이라고 믿는다. 우리는 엘자와 안나가 가장 사이좋은 두 눈사람을 만들기 위해서 도와주려고 한다.
![](https://blog.kakaocdn.net/dn/vFcJo/btsDHnKz7uC/UuS8nAEQgHBnTkaHuKQI01/img.png)
주어진 N개의 눈덩이를 이용하여 만들 수 있는 두 눈사람의 키 차이 중 최솟값을 구하는 프로그램을 작성하시오.
입력 :
첫째 줄에 N (4 ≤ N ≤ 600)이 주어진다.
둘째 줄에는 각 눈덩이 i (1 ≤ i ≤ N)의 지름을 의미하는 정수 Hi (1 ≤ Hi ≤ 109)가 공백으로 구분되어 주어진다.
출력 :
만들 수 있는 두 눈사람의 키 차이 중 최솟값을 나타내는 정수를 출력하라.
풀이)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
// 20366. 같이 눈사람 만들래?
#include <iostream>
#include <vector>
#include <algorithm>
#include <limits.h>
using namespace std;
vector<long long> vec;
int main()
{
int n;
cin >> n;
vec.resize(n);
for (long long& ele : vec) cin >> ele;
sort(vec.begin(), vec.end());
long long ans = LLONG_MAX;
// 엘사의 눈사람을 먼저 만들어준다.
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
long long elsa = vec[i] + vec[j];
// 엘사의 눈사람이 만들어진 후,
// 투 포인터를 이용해 안나의 눈사람도 만들어준다.
int s = 0;
int e = n - 1;
while (s < e)
{
if (s == i || s == j)
{
s++;
continue;
}
if (e == i || e == j)
{
e--;
continue;
}
long long anna = vec[s] + vec[e];
ans = min(ans, abs(elsa - anna));
long long diff = elsa - anna;
if (elsa >= anna) s++;
else if (elsa < anna) e--;
}
}
}
cout << ans;
return 0;
}
|
cs |
출처 : https://www.acmicpc.net/problem/20366
20366번: 같이 눈사람 만들래?
높이가 (2, 5), (3, 5)로 구성된 눈사람 둘을 만드는 것이 최적의 경우 중 하나이다. |7-8| = 1 다른 경우로는 (2, 9), (5, 5)로 두 눈사람을 만드는 경우가 있다. |11-10| = 1
www.acmicpc.net
'Develop > 백준 (Cpp)' 카테고리의 다른 글
[백준] 7453번 : 합이 0인 네 정수 (C++) (1) | 2024.01.25 |
---|---|
[백준] 23032번 : 서프라이즈~ (C++) (0) | 2024.01.23 |
[백준] 1644번 : 소수의 연속합 (C++) (0) | 2024.01.22 |
[백준] 22945번 : 팀 빌딩 (C++) (0) | 2024.01.21 |
[백준] 1806번 : 부분합 (C++) (0) | 2024.01.21 |