poj 输出前k大的数

08:输出前k大的数

总时间限制: 

10000ms

单个测试点时间限制: 

1000ms

内存限制: 

65536kB

描述

给定一个数组,统计前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<cstdio>
#include<algorithm>

using namespace std;
int n, s[100000 + 10], ans[100000 + 10],m=0;
void kp(int k,int l,int r)
{
	if (l > r) return;
	s[0] = s[l];
	int a = l, b = r;
	while (a < b)
	{
		while (a<b&&s[b]>=s[0]) b--;   //别忘了等号!!!
		if (a < b) s[a] = s[b];
		while (a < b&&s[a] <= s[0]) a++;
		if (a < b) s[b] = s[a];
	}
	s[a] = s[0];
	int g = r - a + 1;
	if (g == k)
	{
		for (int i = a; i <= r; i++) ans[m++] = s[i];
		return;
	}
	else if (g > k) kp(k, a+1, r);
	else 
	{
		for (int i = a; i <= r; i++) ans[m++] = s[i];
		kp(k - g, l, a-1);
	}
}
int main()
{
	int k;
	//freopen("in.txt", "r", stdin);
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", &s[i]);
	scanf("%d", &k);
	kp(k, 1, n);
	sort(ans, ans + k);
	for (int i = k-1; i >=0; i--)
	{
		printf("%d\n", ans[i]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/TY_GYY/article/details/81481101