这是60分代码,最后两个点tle了,用的是堆(因为想到了对顶堆),复杂度理论上是O(nlogn),n=5000000
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
priority_queue<int> q;
int n,k,cnt;
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
int tmp;
scanf("%d",&tmp);
if(cnt<=k){
q.push(tmp);
cnt++;
}
else{
if(tmp<q.top()){
q.pop();
q.push(tmp);
}
}
}
printf("%d",q.top());
return 0;
}
这是最后AC的代码,对第k小数二分法O(logm),然后O(n)遍历是否满足条件,复杂度是O(nlogm),n=5000000,m=109
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
int q[5000007];
int n,k,cnt,l,r,mid;
bool judge(int x){
int ans=0;
for(int i=0;i<n;i++){
if(q[i]<=x) ans++;
if(ans>=k+1) return 1;//太大了或者刚好
}
return 0;//太小了
}
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) scanf("%d",&q[i]);
l=1;r=1000000000;
mid=(l+r)>>1;
while(l<r){
mid=(l+r)>>1;
//printf("mid=%d\n",mid);
if(judge(mid)) r=mid;
else l=mid+1;
}
printf("%d",r);
return 0;
}
是我算的有问题吗QAQ