求解
查看原帖
求解
1252442
lucy2012楼主2024/4/13 22:05

题解2有点没看懂 题解源代码

#include<bits/stdc++.h>
using namespace std;
int t,n,a[50505],MAX;
bool check(int x){
	for(int i=x;i<=n;i++){//枚举右点
		int l=i-x+1;//推出左点
		if(a[i]<=0){//一条道走到黑的判断
			if(-a[l]<=t)return true;
		}
		if(a[l]>=0){//不撞南墙不回头的判断
			if(a[i]<=t)return true;
		}
		if(a[l]<=0&&a[i]>=0){//这里把另外两种情况和在了一起
			if(min(-a[l],a[i])+(a[i]-a[l])<=t)return true;
		}
	}
	return false;
}
int main(){
	scanf("%d%d",&t,&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	sort(a+1,a+1+n);
	int lt=-1,rt=n+1;//记住,l一定要设置为-1,万一一个也访问不了捏?
	while(lt+1<rt){
		int mid=lt+(rt-lt)/2;//等价于(lt+rt)/2,但是这样一定爆不掉int
		if(check(mid)){
			lt=mid;//如果可行,就让l(ef)t过去,因为我们想让他越来越大
		}
		else{
			rt=mid;
		}
	}
	printf("%d",lt);//因为最后可行的mid被l(ef)t存起来了,so输出l(ef)t
	return 0;
}

为什么

#include<bits/stdc++.h>
using namespace std;
int t,n,a[50505],MAX;
bool check(int x){
	for(int i=x;i<=n;i++){
		int l=i-x+1;
		if(a[i]<=0){
			if(-a[l]<=t)return true;
		}
		if(a[l]>=0){
			if(a[i]<=t)return true;
		}
		if(a[l]<=0&&a[i]>=0){
			if(min(-a[l],a[i])+(a[i]-a[l])<=t)return true;// 为什么这里不是a[i]-a[l]<=t,而且为什么要求min(-a[l],a[i]) 
		}
	}
	return false;
}
int main(){
	scanf("%d%d",&t,&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	sort(a+1,a+1+n);
	int lt=-1,rt=n+1;//为什么lt=-1?一个也没有输出的不是0咩? 
	while(lt+1<rt){
		int mid=lt+(rt-lt)/2;
		if(check(mid)){
			lt=mid;
		}
		else{
			rt=mid;
		}
	}
	printf("%d",lt);
	return 0;
}

2024/4/13 22:05
加载中...