Codeforces Round #700 (Div. 2) C. Searching Local Minimum(交互)
链接: C. Searching Local Minimum
题意: 给你一个大小为 n 排列 , 一次询问可以得到位置 i 的数,要求在不超过 100 次询问的条件下找到该排列的一个波谷,即找到位置 k满足:a[k] < a[k - 1] && a[k] < a[k + 1]。
思路:
- 我们先假设 a[1]小于 a[n] , 因为已经保证了 a[0] 为 无穷大,所以可以保证 a[0] 已经大于 a[1] , 对于 1 到 n 这一部分,如果他保持单调递增或者 是 先增后减 那么答案就是 1 如果保持单调递减那么答案就是 n. 如果是先减后增那么答案就是那个波谷,所以我们可以证明 答案一定是存在的(当然如果 a[1] 大于 a[n],那么答案同理也是存在的)。
- 所以我们可以利用以上性质,假设存在一个区间 【l , r】,a[l] < a[r],并且 a[l-1] > a[l].那么在 l 到 r 内一定有解,所以我们只需要一直维护这样一个区间 ,并且通过二分不断缩小区间。那么最后一定能得到解。
- 最后考虑怎么一直维持一个这样的区间 , 让 mid = (l + r)/ 2,如过 a[l] < a[mid] ,那么就可以让 r = mid, 此时这个区间[l + 1,mid]仍满足上述条件。如果 a[l] > a[mid] ,那么我们考虑 mid - 1,如果 a[mid - 1] > a[mid],那么 [mid , r] 满足条件。否则的话我们就必须反向考虑 [l , mid - 1] ,也是满足的(注意这里是反向找,就相当于 一 开始 a[1] > a[n]) 具体可以看代码理解(用了flag表示方向)。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e6 + 7;
const int mod = 1e9 + 7;
int T;
int n,a[maxn],vis[maxn];
void query(int x){if(vis[x]) return ;printf ("? %d\n",x);fflush(stdout);scanf("%d",&a[x]);vis[x] = 1;
}
int main (){int l,r,mid;a[0] = a[n + 1] = n + 1;scanf("%d",&n);if(n == 1){printf ("! 1\n");return 0;}query(1);query(n);int flag = 1;if(a[1] > a[n]) flag = 0;l = 1,r = n;while(l <= r){if(flag){query(l + 1);if(a[l] < a[l + 1]){printf ("! %d\n",l);return 0;}mid = (l + r) / 2;query(mid);if(a[mid] > a[l]){r = mid;l += 1;}else{query(mid - 1);if(a[mid - 1] > a[mid]){l = mid;}else {r = mid - 1;flag = 1 - flag;}}}else{query(r - 1);if(a[r] < a[r - 1]){printf ("! %d\n",r);return 0;}mid = (l + r) / 2;query(mid);if(a[mid] > a[r]){l = mid;r -= 1;}else{query(mid + 1);if(a[mid + 1] > a[mid]){r = mid;}else {l = mid + 1;flag = 1 - flag;}}}}return 0;
}
Codeforces Round #700 (Div. 2) C. Searching Local Minimum(交互)相关推荐
- Codeforces Round #700 (Div. 2) C. Searching Local Minimum 交互二分
传送门 题意: 给一个数组,让你找到a[i]<min(a[i+1],a[i−1])a[i]<min(a[i+1],a[i-1])a[i]<min(a[i+1],a[i−1])位置ii ...
- 1479A - Searching Local Minimum 交互,二分,2019 ccpc 哈尔滨 E 拓扑排序
1479A - Searching Local Minimum 交互,二分 找一个区间[l,r]始终满足a[l+1]>a[l]&&a[r]<a[r+1],然后不断缩小区间当 ...
- Codeforces Round #700 (Div. 1Div. 2)
Codeforces Round #700 (Div. 1&&Div. 2) 题号 题目 知识点 A Yet Another String Game 签到 B The Great He ...
- Codeforces Round #700 (Div. 2)A~D2解题报告
Codeforces Round #700 (Div. 2)A~D2解题报告 A Yet Another String Game 原题链接 http://codeforces.com/contest/ ...
- Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...
- 构造图 Codeforces Round #236 (Div. 2) C. Searching for Graph
题目地址 1 /* 2 题意:要你构造一个有2n+p条边的图,使得,每一个含k个结点子图中,最多有2*k+p条边 3 水得可以啊,每个点向另外的点连通,只要不和自己连,不重边就可以,正好2*n+p就结 ...
- Codeforces Round 700 (Div. 2) B题 英雄杀怪兽
Codeforces Round 700 (Div. 2) B题 链接: https://codeforces.com/contest/1480/problem/B 大致意思: n组数据,每组数据的第 ...
- Codeforces Round #700 (Div. 2) A ~ E ,6题全,超高质量良心题解【每日亿题】2021/2/8
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Yet Another String Game B - The Great Hero C ...
- CodeForces - 1480C Searching Local Minimum(交互+二分)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的排列,需要找出一个"局部最小值",所谓"局部最小值"就是对于某个 iii 来说,满足 ai<ai− ...
最新文章
- shell 命令行实现
- MySQL读写分离事务策略实现
- python网络爬虫的论文模板_Python简单网络爬虫实战—下载论文名称,作者信息(上)...
- Zero Quantity Maximization
- c语言通讯录以及写入文件,学C三个月了,学了文件,用C语言写了个通讯录程序...
- [转]VS2010+MFC解析Excel文件中数据
- Linux内核生成版本号的一些研究
- 计算机应用技术试卷在线老师,试卷,计-计算机应用技术.pdf
- 吴恩达|机器学习作业1.1多变量线性回归
- 计算机专用英语1500词带音标,带音标的计算机英语1500词
- 信息入口的新闻客户端如何盈利?
- 妊娠糖尿病食谱、控糖食谱
- decorate装饰模式
- [C#]C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown事件之间的区别 (附KeyChar/KeyCode值)
- 小程序使用mp-html解析html
- Mac 重启后自动启动 docker container
- 目标跟踪之数据标注软件ViBAT使用指导
- python几种矩阵重组降维方式对比
- 【考研英语语法】定语从句全面介绍
- direct do造句 sb to_wish sb to do造句