Codeforces Round #700 (Div. 2)
C - Searching Local Minimum
本文没有具体讲解, 有参考链接
这题不算很难, 如果懂得规则,或者分析出来就可以做, 我一个新手也可能可以搞搞
这题 使用了 类二分查找的判断 局部最小值, 非常妙啊.可以参考这个,有证明.传送门toYoutube
#include <bits/stdc++.h>
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define fori(i,x,y) for(int i=(x); i<(y); i++)
#define rep(i,y,x) for(int i=(y); i>=(x); i--)
#define debug(a) cout << #a << ": " << a << endl
#define FAST ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
const int N = 2e5+10;
const int MAX = 1e5+7;
const int inf = 1e9;
int n;
int a[MAX],vis[MAX];
void query(int num){
if(vis[num]) return;
printf("? %d\n", num);
fflush(stdout);
scanf("%d", &a[num]);
vis[num] = 1;
}
int main()
{
int n;
cin >> n;
a[0] = a[n+1] = inf;
query(1);
query(n);
int l = 1, r= n;
while(l<r){
int mid = (r+l)/2;
query(mid);
query(mid+1);
if(a[mid]<a[mid+1]) r=mid;
else l = mid+1;
}
printf("! %d\n",r);
fflush(stdout);
return 0;
}