반응형

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

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

 

두 수를 묶었을 때의 곱을 최대화하기 위해 수를 정렬해줍니다.

가장 큰 두 개의 양수를 묶거나, 가장 작은 두 개의 음수를 묶으면, 두 수를 더한 것보다 더 큰 수를 구할 수 있습니다.

음수는 0과 묶였을 때, 그 값이 0이 되므로 합을 최대화할 수 있습니다.

1인 두 수는, 두 수를 묶는 것보다 그냥 두 수를 더하는 것이 더욱 합을 최대화할 수 있습니다.

 

#include <iostream>
#include <algorithm>

int n, ans = 0, l, r, arr[10000];

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++) scanf("%d", &arr[i]);
	std::sort(arr, arr + n);
	for (l = 0; l < n - 1 && arr[l + 1] < 1; l += 2)
		ans += arr[l] * arr[l + 1];
	for (r = n - 1; r > 0 && arr[r - 1] > 1; r -= 2)
		ans += arr[r] * arr[r - 1];
	while (l <= r) ans += arr[l++];
	printf("%d", ans);
}
반응형

'Algorithm' 카테고리의 다른 글

백준 14725 : 개미굴  (0) 2021.11.16
백준 1449 : 수리공 항승  (0) 2021.11.16
백준 1080 : 행렬  (0) 2021.11.16
백준 4811 : 알약  (0) 2021.11.16
백준 2470 : 두 용액  (0) 2021.11.16

+ Recent posts