SDNUOJ1060

题目链接:SDNUOJ1060

知识背景

过程函数改变sort的参数
sort(数组起点,数组终点) 并且是左闭右开的方式默认从小到大排序
而我们需要做的是改变sort的排序方式
比如:

bool cmp(int a,int b){
 if(a>b) return true;
 return false;
}

使得sort实现从大到小排序

当有结构体存在的时候也可以使用手写过程函数的方式让sort根据特定元素进行排序

思路

思路1

  1. 把所有的数存起来
  2. sort从大到小排序
  3. 输出第k项
    然后我惊奇的发现,它超内存限制了(MLE)
    无奈,改方法,基本思路:用时间换空间。题目中一直k<=10 ,所以我们只定义11个空间,嘿嘿嘿

思路2

  1. 定义11个空间的数组
  2. 读入k个数
  3. 对着k个数从大到小排序
  4. 逐个读入剩余数字,如果它比原有的k个数的最小的大,那把它放到数列尾部,sort更新数列
  5. 每次只用到了第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;
}

猜你喜欢

转载自blog.csdn.net/L_Saint00/article/details/82994066