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;
}