按照我不一定对的计算,我AC的算法比TLE的复杂度更高
查看原帖
按照我不一定对的计算,我AC的算法比TLE的复杂度更高
44424
zhutier楼主2023/2/2 13:24

这是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(logm),然后O(n)O(n)遍历是否满足条件,复杂度是O(nlogm),n=5000000,m=109O(nlogm),n=5000000,m=10^9

#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

2023/2/2 13:24
加载中...