코테연습일지/그리디

16193 차이를 최대로 2

jemin0619 2024. 3. 5. 23:15

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

 

16193번: 차이를 최대로 2

첫째 줄에 N (3 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100,000보다 크거나 같고, 100,000보다 작거나 같다.

www.acmicpc.net

 

정말 간만에 푸는 덱 문제이다. 그리디가 쉬운건 쉬운데, 어려운건 정말 어려운 알고리즘이라고 느낀다.

 

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

int main(){
    ios::sync_with_stdio(0); cin.tie(0);
    int n; cin>>n;
    deque<int> arr,ans;
    for(int i=0;i<n;i++){
        int a; cin>>a;
        arr.push_back(a);
    }
    sort(arr.begin(),arr.end());
    ans.push_back(arr.back());
    arr.pop_back();
    while(arr.size()){
        int LL = abs(ans.front()-arr.front());
        int LR = abs(ans.front()-arr.back());
        int RL = abs(ans.back()-arr.front());
        int RR = abs(ans.back()-arr.back());
        int mx = max({LL,LR,RR,RL});
        if(mx==LL){
            ans.push_front(arr.front());
            arr.pop_front();
        } else if(mx==LR){
            ans.push_front(arr.back());
            arr.pop_back();
        } else if(mx==RL){
            ans.push_back(arr.front());
            arr.pop_front();
        } else if(mx==RR){
            ans.push_back(arr.back());
            arr.pop_back();
        }
    }
    long long sum=0;
    for(int i=0;i<n-1;i++) sum+=abs(ans[i]-ans[i+1]);
    cout<<sum;
    return 0;
}