描述
给定一个数组,统计前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
我の思考
这个题看起来不难,数字比较大,就是希望我们在时间上能少一点,然后我们就去避免把去排序所有的数字。我们就假设这个k值,分成大于k的和小于k的。如果我们要输出的k比排序后得到的大的部分的数组相等或者要小,我们就排序这里的。如果还欠了数字,我们就把剩下的小数组里面取出排在前n-k个的。
我の代码
#include <iostream> #include <algorithm> using namespace std; int x[100005]; int b[100005]; int c[100005]; int j=0; int m=0; bool cmp(int one,int two){ return one>two; } void func(int* a,int k,int y){ sort(a,a+y,cmp); for(int n=0;n<k;n++){ cout<<a[n]<<endl; } if(k-1<=y){ return; } if(k-1>y){ func(b,k-y,j); } } int main() { int n; cin>>n; for(int i=0;i<n;i++){ cin>>x[i]; } int k; cin>>k; for(int i=0;i<n;i++){ if(x[i]<k){ b[j]=x[i]; j++; }else{ c[m]=x[i]; m++; } } func(c,k,m); return 0; }
我の小结
其实之前还不熟悉sort函数的用法还有头文件QAQ,然后发现自己写的代码还是有点臃肿。