求助TLE
查看原帖
求助TLE
393934
zhicheng楼主2022/9/2 17:42

RT。感觉代码复杂度是对的但是最后两个点开O2都过不去。思路是排序后每次找到最后一个最小值和第一个最大值以保持有序。然后模拟就行了。

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main(){
	int n,ans,l,r,mid,*u;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	sort(a+1,a+n+1);
	while(1){
		u=upper_bound(a+1,a+n+1,a[1]);  //第一个最小值之后的一个
		if(a[1]==a[n]||*u==a[n]){  
			printf("Slavko\n%d %d",a[1],a[n]);
			break;
		}
		*(u-1)=*u;//模拟
		if(*upper_bound(a+1,a+n+1,a[1])==a[n]){
			printf("Mirko\n%d %d",a[1],a[n]);
			break;
		}
		l=1;
		r=n;
		while(l<=r){  //第一个最大值的前一个
			mid=(l+r)>>1;
			if(a[mid]<a[n]){
				l=mid+1;
				ans=mid;
			}
			else{
				r=mid-1;
			}
		}
		a[ans+1]=a[ans];
	}
}
2022/9/2 17:42
加载中...