众所周知,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; }