众所周知,JY的百度搜索算法已经练的炉火纯青,任何搜索题都能0.000ms出解。
不幸的是,JY遇到了一道百度搜索算法解决不了的题目,题目是这样的:
给定N个数A[1] A[2] .. A[N],你需要将其重新排序,满足:
1. 对于1<i<=N,A[i]>=A[i/2]。(i/2取下整)
2. 在所有满足条件1的答案中,取A[1]最大的。
3. 仍有多解则取A[2]最大的,依次类推。
JY只好去问他的LBH,可是LBH正在准备数学联赛,没空理JY。JY表示懒得做这道水题,于是
这道题就交给你了。
Input
第一行 N
接下来一行N个数
N<=100000
Output
一行N个数,相邻的数用空格隔开
Sample Input
7
1 2 3 4 5 6 7
Sample Output
1 5 2 7 6 4 3

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int N=100005;
int n,a[N],b[N];
priority_queue <int> heap;
vector <int> vec[N];
void read(int &x)
{
    x=0; int f=1; char ch;
    for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') f=-1;
    for (;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; x*=f;
}
int main()
{
    read(n); for (int i=1;i<=n;i++) read(a[i]);
    sort(a+1,a+n+1);
    for (int i=2;i<=n;i++)
	{
	vec[i/2].push_back(i);
	//数字i丢到i/2这个向量中,相当于它们两者之间有一条边 
	//图出来后,呈一棵树的形态 
	}
    heap.push(1);//1进堆中 
    for (int x,i=1;i<=n;i++)
	{
        x=heap.top(); //弹出堆顶元素x,并对其赋值 
		heap.pop(); 
		b[x]=a[i];
        for (int k,j=0;j<(int)vec[x].size();j++)
        //将所有与x相连的数字进堆(大根堆) 
		{
            k=vec[x][j]; 
			heap.push(k);//入堆 
        }
    }
    for (int i=1;i<n;i++) printf("%d ",b[i]);
    printf("%d\n",b[n]);
    return 0;
}