题目大意
这是个交互题,一开始我们只知道一个n,让我们找出局部最小值的索引
题解
我们可以读入下标为i-1,i,i+1的数组中的值,如果a[i-1]<a[i],我们的局部最小值在i的左边一定存在,就在左半个区间中继续寻找,如果a[i]>a[i+1],局部最小值就在右边,如果两种情况都没有,那下标i对应的元素就是局部最小值
#include<cstdio>
int main(){
int n,m;
scanf("%d",&n);
int l=1,r=n+1,mid,midm,midl,midr;
while(l<r){
mid=(l+r)/2;
printf("? %d\n",mid-1?mid-1:1);
fflush(stdout);
scanf("%d",&midl);
printf("? %d\n",mid);
fflush(stdout);
scanf("%d",&midm);
printf("? %d\n",(mid+1)>n?n:mid+1);
fflush(stdout);
scanf("%d",&midr);
if(midl<midm){
r=mid;
}else if(midr<midm){
l=mid+1;
}else{
l=mid;
break;
}
}
printf("! %d\n",l);
}