这是怎么TLE的???
查看原帖
这是怎么TLE的???
220824
yyz1005楼主2023/9/18 17:17
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 100010;
const double eps = 1e-8;
ll n,a[N];
double dp[N];
double b[N];
bool check1(double x){
	for(ll i = 1; i <= n; i++) b[i] = a[i]-x;
	dp[1] = b[1];
	for(ll i = 2; i <= n; i++) dp[i] = max(dp[i-1]+b[i],dp[i-2]+b[i]);
	if(dp[n]<0.0&&dp[n-1]<0.0) return false;
	return true;
}
bool check2(double x){
	memset(b,0,sizeof(b));
	memset(dp,0,sizeof(dp));
	for(ll i = 1; i <= n; i++){
		if(a[i]>=x) b[i] = 1;
		else b[i] = -1;
	}
	dp[1] = b[1];
	for(ll i = 2; i <= n; i++) dp[i] = max(dp[i-2]+b[i],dp[i-1]+b[i]);
	if(dp[n]<=0&&dp[n-1]<=0) return false;
	return true;
}
int main(){
	scanf("%lld",&n);
	for(ll i = 1; i <= n; i++) scanf("%lld",&a[i]);
	double l = 0.00,r = 1000000010.0,mid;
	while(r-l>=eps){
		mid = (l+r)/2.0;
		if(check1(mid)) l = mid+eps;
		else r = mid-eps;
	}
	printf("%lf\n",l);
	sort(a+1,a+n+1);
	ll L = 0,R = 1e9+10,res;
	
	while(L<=R){
		ll mid = (L+R)>>1;
		if(check2(mid)) L = mid+1,res = mid;
		else R = mid-1;
		
	}
	printf("%lld\n",res);
	return 0;
}

log⁡1e9⋅n\log1e9 \cdot n 为什么能 TLE\text{TLE}

2023/9/18 17:17
加载中...