• 懒惰的JY



    众所周知,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
    ",b[n]);
        return 0;
    }
    

      

  • 相关阅读:
    第12组 Beta冲刺(2/5)
    第12组 Beta冲刺(1/5)
    第12组 Alpha事后诸葛亮
    第12组 Alpha冲刺(6/6)
    第12组 Alpha冲刺(5/6)
    期末大作业(第十七小组)
    补交:第2次&第5次实践作业
    第6次实践作业 (第17小组)
    第4次实践作业
    第3次实践作业
  • 原文地址:https://www.cnblogs.com/cutemush/p/12291836.html
Copyright © 2020-2023  润新知