codeoforces-1131C. Birthday-题解
题目:
生日
弗拉德今天过生日 ! 有n的孩子来参加庆祝活动。为了迎接弗拉德,孩子们决定围成一圈。在来的孩子中,有高的也有低的,所以如果他们任意的站成一个圆圈,可能会发现,有一个高的和低的孩子站在一起,他们很难牵手。因此,孩子们想要站成一个圆圈,这样两个相邻的孩子的成长差异就会尽可能的小。
形式上,我们把1个子结点的个数按圆圈的顺序从1到n,也就是说,对于每一个 i 个子结点,i+1的子结点旁边都有一个 i 子结点,同样,1个子结点旁边也有一个 n 子结点。那么,我们就把站在一起的孩子身高的最大绝对差异称为圆圈的不适感。
请帮助孩子们找到他们应该如何重新排序自己,这样造成的不适是最小的可能。
输入
第一行包含一个整数n(2≤n≤100)——参加牛仔弗拉德生日的孩子的数量。
第二行包含整数a1,a2,…,an(1≤ai≤10^9),表示每个孩子的身高。
输出
精确打印n整数——子节点的高度,按照它们应该站成一个圆圈的顺序。您可以开始打印一个圆圈与任何孩子。
如果有多个可能的答案,打印其中任何一个。
例子
input
5
2 1 1 3 2
output
1 2 3 2 1
input
3.
30 10 20
output
10 20 30
我的思路:
先将数组 a[ ] 排序,然后先从头开始,隔一个元素输出一个,然后,再从最后一个元素开始隔一个输出,eg:
1 3 2 4 7 5 6 重新sort后为:1 2 3 4 5 6 7,然后只要输出:1 3 5 7 6 4 2即可。
code:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);//1 2 3 4 5 6 7
for(int i=0;i<n;i=i+2)
cout<<a[i]<<" ";
if(n%2==0)
for(int i=n-1;i>=0;i=i-2)
cout<<a[i]<<" ";
else
for(int i=n-2;i>0;i=i-2)
cout<<a[i]<<" ";
return 0;
}
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ OC保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
不过下面还有别人的code:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 100 + 10;
int a[MAXN];
int main()
{
int n;
cin >> n;
for (int i = 1;i <= n;i++)
cin >> a[i];
sort(a + 1, a + 1 + n);
vector<int> res;
vector<int> tmp;
for (int i = 1;i <= n;i += 2)
res.push_back(a[i]);
for (int i = 2;i <= n;i += 2)
tmp.push_back(a[i]);
reverse(tmp.begin(), tmp.end());
for (auto x : tmp)
res.push_back(x);
for (auto x : res)
cout << x << ' ';
return 0;
}