疯狂队列
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;
}
操作序列
https://www.nowcoder.com/practice/b53bda356a494154b6411d80380295f5
找规律即可。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n, a;
cin >> n;
vector<int> v, r;
for (int i = 0;i < n;i++) {
cin >> a;
v.push_back(a);
}
int i;
for (i = n - 1;i > -1;i -= 2) {
r.push_back(v[i]);
}
if (i == -1)i = 0;
else i = 1;
for (i = i;i < n; i += 2) {
r.push_back(v[i]);
}
for (int i = 0;i < n;i++) {
cout << r[i];
if (i < n - 1)cout << ' ';
}
return 0;
}