题解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;
}