算法题(315)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tfcy694/article/details/88586250
疯狂队列

https://www.nowcoder.com/practice/d996665fbd5e41f89c8d280f84968ee1
要点:起初设想是把值摆到两头,发现不对;于是把最值摆到中间即可。最后根据奇、偶数需要做微调。

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<deque>
#include<vector>
using namespace std;

int main(){
    int n;cin>>n;
    vector<int> v(n,0);
    for(int i=0;i<n;i++)cin>>v[i];
    if(n==1){
        cout<<0<<endl;
        return 0;
    }
    sort(v.begin(),v.end());
    
    deque<int> d;
    int l=0,r=n-1;
    d.push_front(v[r]);
    r--;
    while(l<=r){
        if(l<=r){
            d.push_front(v[l++]);
            if(l<=r)d.push_back(v[l++]);
        }
        if(l<=r){
            d.push_front(v[r--]);
            if(l<=r)d.push_back(v[r--]);
        }
    }
    //最后一个元素可能会错位
    if(abs(d[n-1]-d[n-2])<abs(d[n-1]-d[0])){
        d.push_front(d.back());
        d.pop_back();
    }
    
    int res=0;
    for(int i=1;i<n;i++)res+=abs(d[i]-d[i-1]);
    cout<<res<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/tfcy694/article/details/88586250
315