[BOJ 8016] - Insulator (그리디, 수학, 정렬, C++, Python)

보양쿠·2024년 3월 5일
0

BOJ

목록 보기
209/252

BOJ 8016 - Insulator 링크
(2024.03.05 기준 S5)

문제

A를  A=i=1nai+i=1n1max(0,ai+1ai)A= \sum_{i=1}^{n} {a_i} + \sum_{i=1}^{n-1} {max(0, a_{i+1}-a_i)}로 정의할 때, a의 순서를 임의로 바꿔서 가능한 A의 최댓값을 출력

알고리즘

간단한 그리디

풀이

aa를 오름차순으로 정렬해보자. 그럼 이제 첫 번째로 생각할 수 있는 방법은 정렬된 수열 그대로 AA를 구해보는 것이다. 그러면 A=i=1nai+ana1A= \sum_{i=1}^{n} {a_i} + a_n - a_1가 나올 것이다. 이게 최댓값일까?

AAan1a2a_{n-1} - a_2를 더해보자. AA은 무조건 같거나 증가하게 된다. 느낌이 오지 않는가? 오름차순을 정렬된 aa에서 AA의 최댓값을 구하기 위해선 a1,an,a2,an1,a_1, a_n, a_2, a_{n-1}, \dots의 순서로 배치하면 된다. 즉, A=i=1nai+i=n/2naii=1n/2aiA= \sum_{i=1}^{n} {a_i} + \sum_{i=n/2}^{n} {a_i} - \sum_{i=1}^{n/2} {a_i}가 된다.

코드

  • C++
#include <bits/stdc++.h>
using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n; cin >> n;
    int a[n]; for (int i = 0; i < n; i++) cin >> a[i];

    sort(a, a + n);
    int A = 0; for (int i = 0; i < n; i++) A += a[i];
    for (int i = 0; i < n / 2; i++) A += a[n - i - 1] - a[i];

    cout << A;
}
  • Python
n, *a = map(int, open(0).read().split())

a.sort()
A = sum(a)
for i in range(n // 2):
    A += a[n - i - 1] - a[i]

print(A)
profile
GNU 16 statistics & computer science

0개의 댓글