Skip to content

10819 차이를 최대로 {boj} {permutation}

C++ 코드#

#include<iostream>
#include<vector>
#include<climits>
#include<cmath>
#include<algorithm>
using namespace std;

int max_diff(vector<int>& seq);
int sum_diff(const vector<int>& seq);
bool next_permu(vector<int>& seq);
bool prev_permu(vector<int>& seq);
void swap(int& a, int& b);

int main(void)
{
    int n = 0;
    cin >> n;
    vector<int> seq(n);
    for (int i = 0; i < n; i++) cin >> seq[i];
    sort(seq.begin(), seq.end());
    cout << max_diff(seq) << '\n';
    return 0;
}
int sum_diff(const vector<int>& seq)
{
    int ret = 0;
    for (int i = 0; i < seq.size()-1; i++)
        ret += abs(seq[i] - seq[i+1]);
    return ret;
}
int max_diff(vector<int>& seq)
{
    int ret = INT_MIN;
    ret = max(ret, sum_diff(seq));
    // <algorithm> header 의 next_permutation() 함수는 시간초과가 발생하지 않는다.
    //while(next_permutation(seq.begin(), seq.end())) ret = max(ret, sum_diff(seq));        
    while(next_permu(seq)) {            // 왜 시간초과가 발생하지?
        ret = max(ret, sum_diff(seq));
#if DBG > 0
for (auto i : seq) cout << i << ' ';
cout << '\n';
#endif
    }
    //while(prev_permu(seq)) ret = max(ret, sum_diff(seq));
    return ret;
}
bool next_permu(vector<int>& seq)
{
    int i = 0, j = 0;
    for (i = seq.size()-1; i >= 0; i--){
        if (i == 0) return false;
        if (seq[i-1] < seq[i]) break;
    }
    for (j = i; j < seq.size()-1; j++)
        if (seq[j+1] <= seq[i-1]) break;
    swap(seq[i-1], seq[j]);

    for (int k = seq.size()-1; k > i; k--)
        swap(seq[i++], seq[k]);
    return true;
}
bool prev_permu(vector<int>& seq)
{
    int i = 0, j = 0;
    for (i = seq.size()-1; i >= 0; i--){
        if (i == 0) return false;
        if (seq[i-1] > seq[i]) break;
    }
    for (j = i+1; j < seq.size(); j++)
        if (seq[j+1] > seq[i-1]) break;
    swap(seq[i-1], seq[j-1]);

    for (int k = seq.size()-1; k > i; k--)
        swap(seq[i++], seq[k]);
    return true;
}
void swap(int& a, int& b)
{
    int tmp = a;
    a = b;
    b = tmp;
}