Searching Local Minimum-(交互+二分)

题目链接:点击进入
题目

在这里插入图片描述

题意

在不超过100次的询问下, 找出一个k满足, a [ k ] < min ( a [ k - 1 ] , a [ k + 1 ] ) ,a 数组是长度为 n 的排列 , a [ 0 ] 和 a [ n + 1 ] 为正无穷大,每次询问下标 i ,给出下标对应数组值 a [ i ] .

思路

100次,n 范围1e5,二分!?
每次询问 mid 和 mid + 1,如果mid对应值更小说明k在左边,否则在右边

代码
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define best 131 
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define lowbit(x) x & -x
#define inf 0x3f3f3f3f
//#define int long long
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double eps=1e-7;
const double pai=acos(-1.0);
const int N=2e4+10;
const int maxn=1e6+10;
const int mod=1e9+7;
int t,n,m,k,ans;
int	main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);cout.tie(0);
    cin>>n;
    int l=1,r=n,a,b;
    while(l<r)
    {
    	int m1=(l+r)>>1;
		int m2=m1+1;
		cout<<"? "<<m1<<endl;
		cin>>a;
		cout<<"? "<<m2<<endl;
		cin>>b;
		if(a<b) r=m1;
		else l=m2;
	}
	cout<<"! "<<l<<endl;
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值