Searching Local Minimum-(交互+二分)

本文介绍了一种在不超过100次询问的情况下找到数组中极小值点的方法。通过二分查找策略,在长度为n的数组中确定满足条件的k值,即a[k]<min(a[k-1],a[k+1]),考虑到边界情况a[0]和a[n+1]定义为正无穷大。
题目链接:点击进入
题目

在这里插入图片描述

题意

在不超过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;
}
在 Ubuntu 20.04 系统下,当出现 `/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/9/libstdc++.a when searching for -lstdc++`、`/usr/bin/ld: cannot find -lstdc++` 和 `collect2: error: ld returned 1 exit status` 报错,且 `g++ 1.cpp -o 1` 编译正常时,可以尝试以下解决办法: ### 检查编译环境 确保编译命令使用的是系统自带的 `g++` 编译器。可以使用 `which g++` 命令查看 `g++` 的路径,确保路径指向系统自带的编译器。 ### 检查库文件路径 使用 `ldconfig -p | grep libstdc++` 命令查看系统中 `libstdc++` 库的路径。若没有找到相关路径,可能需要手动添加。 ```bash ldconfig -p | grep libstdc++ ``` ### 设置库文件搜索路径 如果库文件存在,但链接器无法找到,可以通过设置 `LD_LIBRARY_PATH` 环境变量来指定库文件的搜索路径。 ```bash export LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9:$LD_LIBRARY_PATH ``` 可以将上述命令添加到 `~/.bashrc` 或 `~/.bash_profile` 文件中,使其永久生效。 ### 检查编译选项 确保编译命令中没有错误的选项。例如,检查是否使用了错误的架构选项。 ### 重新安装标准 C++ 库 可以尝试重新安装 `libstdc++` 库。在基于 Debian 或 Ubuntu 的系统上,可以使用以下命令进行安装: ```bash sudo apt-get update sudo apt-get install --reinstall libstdc++-9-dev ``` ### 建立软连接 如果系统中存在 `libstdc++.so` 或 `libstdc++.a` 文件,但链接器无法找到,可以尝试建立软连接。 ```bash sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/9/libstdc++.so /usr/lib/libstdc++.so sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/9/libstdc++.a /usr/lib/libstdc++.a ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值