如你所见,这是一份AC代码。
#include<bits/stdc++.h>
#define int long long
using namespace std;
void read(int &x){
x=0;bool f=0;char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-')f=1;
ch=getchar();
}do{x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}while(ch>='0'&&ch<='9');
x=f?-x:x;
}
int n,t,a[50001],s,b;
signed main(){
read(t),read(n);
for(int i=1;i<=n;i++)read(a[i]);
sort(a+1,a+1+n),s=lower_bound(a+1,a+1+n,0)-a;
for(int i=s;i<=n&&a[i]<=t;i++){//往右跑,在回头去跑左边
int j=max(0ll,t-a[i]*2);
b=max(b,i-(upper_bound(a+1,a+1+n,-j)-a)+1);
}for(int i=s-1;i>0&&-a[i]<=t;i--){//往左跑,再往右跑。
int j=max(0ll,t+a[i]*2);
b=max(b,(upper_bound(a+1,a+1+n,j)-a)-i);
}cout<<b;
return 0;
}
其中:
for(int i=s-1;i>0&&-a[i]<=t;i--){
int j=max(0ll,t+a[i]*2);
b=max(b,(upper_bound(a+1,a+1+n,j)-a)-i);
}
在文意理解中这才是正确的,但是这也能过。
for(int i=1;i<s&&-a[i]<=t;i++){
int j=max(0ll,t+a[i]*2);
b=max(b,(upper_bound(a+1,a+1+n,j)-a)-i);
}