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;
}

 

posted @ 2019-03-13 01:44  金鳞踏雨  阅读(9)  评论(0编辑  收藏  举报  来源