我下载了第二个数据的测试点,标准答案是 28769 ,然后我把它的输入保存,放到桌面,再在代码里写了个freopen ,结果我的输出也是 28769 ,我雾了,这是为甚么?
代码:
#include<bits/stdc++.h>
using namespace std;
const int INF=2147483647,N=5e4+5;
int t,n,ans=-INF,a,lz,lf,max1,max2;
int z[N],f[N];
inline int read()
{
int x=0;
bool w=0;
char c=getchar();
while(!isdigit(c))
w|=c,c=getchar();
while(isdigit(c))
x=(x<<1)+(x<<3)+(c^48),c=getchar();
return w?-x:x;
}
int main()
{
//freopen("121212.txt","r",stdin);
t=read(),n=read();
for(register int i=1;i<=n;++i)
{
a=read();
if(a>0)
{
z[++lz]=a;
if(a<=t) max1=lz;
}
else
{
f[++lf]=-a;
if(-a<=t) max2=lf;
}
}
// cout<<"lz "<<lz<<" lf "<<lf<<" max1 "<<max1<<" max2 "<<max2<<endl;
sort(z+1,z+lz+1);
sort(f+1,f+lf+1);
// for(register int i=1;i<=lz;++i)
// cout<<z[i]<<' ';cout<<endl;
// for(register int i=1;i<=lf;++i)
// cout<<f[i]<<' ';cout<<endl;
// cout<<"l r mid i sum\n";
for(register int i=1;i<=lz && i*2<=t;++i)
{
int l=0,r=lf,mid,tt=t-2*z[i],sum=i;
while(l<=r)
{
mid=(l+r)>>1;
// cout<<l<<' '<<r<<' '<<mid<<' '<<i;
if(f[mid]>tt) r=mid-1;
else if(f[mid]<tt) l=mid+1,sum=mid+i;
else if(f[mid]==tt)
{
sum=mid+i;
break;
}
// cout<<' '<<sum<<endl;
}
// cout<<sum<<endl;
ans=max(ans,sum);
}
for(register int i=1;i<=lf && i*2<=t;++i)
{
int l=0,r=lz,mid,tt=t-2*f[i],sum=i;
while(l<=r)
{
mid=(l+r)>>1;
if(f[mid]>tt) r=mid-1;
else if(f[mid]<tt) l=mid+1,sum=mid+i;
else if(f[mid]==tt)
{
sum=mid+1;
break;
}
}
ans=max(sum,ans);
}
printf("%d",max(max(max1,max2),ans));
return 0;
}
这是当时的情况/jk
