输出前k大的数(北京大学ACM-ICPC竞赛训练暑期课 ) (分治)

描述

给定一个数组,统计前k大的数并且把这k个数从大到小输出。

输入第一行包含一个整数n,表示数组的大小。n < 100000。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。
第三行包含一个整数k。k < n。输出从大到小输出前k大的数,每个数一行。样例输入

10
4 5 6 9 8 7 1 2 3 0
5

样例输出

9
8
7
6
5

#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int n,k;
int a[100000+5];
void find(int l,int r,int ans)
{
    if(l>=r) return ;
    int ll=l,rr=r;
    while(l!=r)
    {
        while(l<r && a[l]<=a[r]) r--;
        swap(a[l],a[r]);
        while(l<r && a[l]<=a[r]) l++;
        swap(a[l],a[r]);
    }
    if(rr-l+1 == ans) return ;
    rr-l+1 < ans  ? find(ll,l-1,ans-(rr-l+1))  :find(l+1,rr,ans);
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)    cin>>a[i];
    cin>>k;
    find(0,n-1,k);
    sort(a+n-k,a+n);
    for(int t=n-1;t>=n-k;t--)
        cout<<a[t]<<endl;    
    return 0;
} 
View Code

猜你喜欢

转载自www.cnblogs.com/Shallow-dream/p/11421313.html