Rt,本蒟蒻先写了个35pts的乱猜结论
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int n,i,m,x,cnt,ans,mid;
int a[1<<20|1];
int find(int *num,int x,int len)
{
int l=0,r=len-1,mid,cnt=0,w;
while(l<r)
{
cnt++;
w=rand()%2;
mid=(l+r+w)/2;
if(num[mid]-w<x) l=mid+!w;
else r=mid-w;
}
return cnt;
}
int main(){
srand(time(NULL));
scanf("%d",&n);
for(i=0;i<n;++i)
scanf("%d",a+i);
scanf("%d",&m);
while(m--)
printf("%d\n",find(a,x,n));
return 0;
}
然后愤愤然写了个3.7k的巨长代码
#include <time.h>
#include <stdlib.h>
int n,i,m,x,cnt,ans,mid,now;
int a[1<<20|1];
int find(int *num,int x,int len)
{
int l=0,r=len-1,mid,cnt=0,w;
while(l<r)
{
cnt++;
w=rand()%2;
mid=(l+r+w)/2;
if(num[mid]-w<x) l=mid+!w;
else r=mid-w;
}
return cnt;
}
int main(){
scanf("%d",&n);
for(i=0;i<n;++i)
scanf("%d",a+i);
scanf("%d",&m);
while(m--){
scanf("%d",&x);
int ret=find(a,x,n);
now=find(a,x,n);
if(ret>now)
ret=now;
//此处省略上千行
now=find(a,x,n);
if(ret>now)
ret=now;
printf("%d\n",ret);
}
return 0;
}
光荣得到六十。
然后我对于每次二分,对 w=1,0 都进行运算,取较小值,复杂度应该问题不大,但是想知道正解是啥。。。