版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}