004:输出前k大的数(分治加浅二分)

描述
给定一个数组,统计前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


有聚聚路过看到的话帮忙看一下为什么会这样

http://acmicpc.openjudge.cn/practice/004/ 原题链接


	如果sort()排序和输出k个数的代码都放在find()函数里会WAWAWAWA,为什么啊?
	if(rr-l+1 == ans)
	{
		sort(a+n-k,a+n);
		for(int t=n-1;t>=n-k;t--)
			cout<<a[t]<<endl;
		return ;
	}	
	
	

AC代码:

#include<bits/stdc++.h>
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;
} 
发布了94 篇原创文章 · 获赞 29 · 访问量 8580

猜你喜欢

转载自blog.csdn.net/m0_43382549/article/details/96569453