题目链接:SDNUOJ1060
知识背景
过程函数改变sort的参数
sort(数组起点,数组终点) 并且是左闭右开的方式默认从小到大排序
而我们需要做的是改变sort的排序方式
比如:
bool cmp(int a,int b){
if(a>b) return true;
return false;
}
使得sort实现从大到小排序
当有结构体存在的时候也可以使用手写过程函数的方式让sort根据特定元素进行排序
思路
思路1
- 把所有的数存起来
- sort从大到小排序
- 输出第k项
然后我惊奇的发现,它超内存限制了(MLE)
无奈,改方法,基本思路:用时间换空间。题目中一直k<=10 ,所以我们只定义11个空间,嘿嘿嘿
思路2
- 定义11个空间的数组
- 读入k个数
- 对着k个数从大到小排序
- 逐个读入剩余数字,如果它比原有的k个数的最小的大,那把它放到数列尾部,sort更新数列
- 每次只用到了第k+1项,大幅减少内存占用,但是每次运行一遍sort
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[12];
bool cmp(int a,int b){
if(a>=b) return true;
return false;
}
int main(){
int n,k;
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=0;i<k;i++){
cin>>a[i];
}
sort(a,a+k,cmp);
for(int i=k;i<n;i++){
int t;
cin>>t;
if(t>=a[k-1]){
a[k]=t;
sort(a,a+k+1,cmp);
}
}
cout<<a[k-1]<<endl;
return 0;
}