AcWing 5995. 挖矿
原题链接
中等
作者:
小贰
,
2024-11-05 23:40:14
,
所有人可见
,
阅读 26
include[HTML_REMOVED]
using namespace std;
int n,a[2000005],m,mx,b[2000005] ,s,mx2;//范围
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(x<0) b[abs(x)]++;//负数 放b数组
else a[x]++; //不要用偏移量 不好算范围
}
for(int i=1;i<=2000000;i++)//范围
a[i]+=a[i-1] ,b[i]+=b[i-1] ;
//两种情况要么不走回头 要么只回头一次 所以要么都在 同一边 要么两边都有
for(int i=1,j=m;j>=0;j-=2,i++)//0在a数组
{
mx=max(a[j]+b[i-1],mx);//从右端往中间走两步 左端就往左端走一步
mx2=max(a[i-1]+b[j],mx2); //反之左端往中间走两步 右端走一步
}
cout<<max(mx,mx2);
return 0;
}