链接:
https://codeforces.com/problemset/problem/1339/B
题意:
给定长度n的数列,将它排序成相邻两数之间差值的绝对值为非减序列
解:
直接输出的话,要从原数列中间开始取
先从后面开始填充一下答案的话更容易,不过要多n次循环,试了一下没超时,就按这种来
解法是从后面开始,填充一个数列最大数,再填一个最小数,然后把它们去除(双指针),然后再填充一个最大数,一个最小数,然后正序输出答案串即可,因为原数列最大数和最小数的差值绝对值最大,越靠内越小,所以正序直接输出答案要从中间开始取
实际代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define csh(a) memset(a,0,sizeof(a))
using namespace std;
const int Size=1E5+5;
int sz[Size];
int ans[Size];
void check(int n)
{
int temp=abs(ans[2]-ans[1]);
for(int i=2;i<=n;i++)
{
int mao=abs(ans[i]-ans[i-1]);
if(mao>=temp)
{
temp=mao;
}
else cout<<"Wrong answer"<<endl;
}
}
int main()
{
int T;
cin>>T;
for(int f=1;f<=T;f++)
{
csh(sz);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>sz[i];
}
sort(sz+1,sz+n+1);
int l=1,r=n;
bool dx=0;
for(int i=n;i>=1;i--)
{
if(dx==0)
{
ans[i]=sz[r];
r--;
dx=1;
}
else
{
ans[i]=sz[l];
l++;
dx=0;
}
}
check(n);
for(int i=1;i<=n;i++)
{
cout<<ans[i]<<" ";
}
cout<<endl;
}
}
限制:
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output