链接: C. Searching Local Minimum
题意: 给你一个大小为 n 排列 , 一次询问可以得到位置 i 的数,要求在不超过 100 次询问的条件下找到该排列的一个波谷,即找到位置 k满足:a[k] < a[k - 1] && a[k] < a[k + 1]。
思路:

  1. 我们先假设 a[1]小于 a[n] , 因为已经保证了 a[0] 为 无穷大,所以可以保证 a[0] 已经大于 a[1] , 对于 1 到 n 这一部分,如果他保持单调递增或者 是 先增后减 那么答案就是 1 如果保持单调递减那么答案就是 n. 如果是先减后增那么答案就是那个波谷,所以我们可以证明 答案一定是存在的(当然如果 a[1] 大于 a[n],那么答案同理也是存在的)。
  2. 所以我们可以利用以上性质,假设存在一个区间 【l , r】,a[l] < a[r],并且 a[l-1] > a[l].那么在 l 到 r 内一定有解,所以我们只需要一直维护这样一个区间 ,并且通过二分不断缩小区间。那么最后一定能得到解。
  3. 最后考虑怎么一直维持一个这样的区间 , 让 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(交互)相关推荐

  1. 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 ...

  2. 1479A - Searching Local Minimum 交互,二分,2019 ccpc 哈尔滨 E 拓扑排序

    1479A - Searching Local Minimum 交互,二分 找一个区间[l,r]始终满足a[l+1]>a[l]&&a[r]<a[r+1],然后不断缩小区间当 ...

  3. Codeforces Round #700 (Div. 1Div. 2)

    Codeforces Round #700 (Div. 1&&Div. 2) 题号 题目 知识点 A Yet Another String Game 签到 B The Great He ...

  4. Codeforces Round #700 (Div. 2)A~D2解题报告

    Codeforces Round #700 (Div. 2)A~D2解题报告 A Yet Another String Game 原题链接 http://codeforces.com/contest/ ...

  5. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  6. 构造图 Codeforces Round #236 (Div. 2) C. Searching for Graph

    题目地址 1 /* 2 题意:要你构造一个有2n+p条边的图,使得,每一个含k个结点子图中,最多有2*k+p条边 3 水得可以啊,每个点向另外的点连通,只要不和自己连,不重边就可以,正好2*n+p就结 ...

  7. Codeforces Round 700 (Div. 2) B题 英雄杀怪兽

    Codeforces Round 700 (Div. 2) B题 链接: https://codeforces.com/contest/1480/problem/B 大致意思: n组数据,每组数据的第 ...

  8. Codeforces Round #700 (Div. 2) A ~ E ,6题全,超高质量良心题解【每日亿题】2021/2/8

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Yet Another String Game B - The Great Hero C ...

  9. CodeForces - 1480C Searching Local Minimum(交互+二分)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的排列,需要找出一个"局部最小值",所谓"局部最小值"就是对于某个 iii 来说,满足 ai<ai− ...

最新文章

  1. shell 命令行实现
  2. MySQL读写分离事务策略实现
  3. python网络爬虫的论文模板_Python简单网络爬虫实战—下载论文名称,作者信息(上)...
  4. Zero Quantity Maximization
  5. c语言通讯录以及写入文件,学C三个月了,学了文件,用C语言写了个通讯录程序...
  6. [转]VS2010+MFC解析Excel文件中数据
  7. Linux内核生成版本号的一些研究
  8. 计算机应用技术试卷在线老师,试卷,计-计算机应用技术.pdf
  9. 吴恩达|机器学习作业1.1多变量线性回归
  10. 计算机专用英语1500词带音标,带音标的计算机英语1500词
  11. 信息入口的新闻客户端如何盈利?
  12. 妊娠糖尿病食谱、控糖食谱
  13. decorate装饰模式
  14. [C#]C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown事件之间的区别 (附KeyChar/KeyCode值)
  15. 小程序使用mp-html解析html
  16. Mac 重启后自动启动 docker container
  17. 目标跟踪之数据标注软件ViBAT使用指导
  18. python几种矩阵重组降维方式对比
  19. 【考研英语语法】定语从句全面介绍
  20. direct do造句 sb to_wish sb to do造句

热门文章

  1. IPv6闲谈-一起玩玩IPv6自动配置
  2. 近似计算:π/4=1-1/3+1/5-1/7...
  3. 昭阳区计算机学校,昭阳区高级职业中学
  4. 大数据中的物联网运用
  5. 廖雪峰 php教程,获取廖雪峰老师的Python3教程的php脚本
  6. 东芝或于今秋出售子公司智能电表巨头兰吉尔
  7. 第147杆147分诞生!吉尔伯特冠军联赛创历史
  8. 第一阶段:JAVA快速入门
  9. [翻译]-马丁·福勒-page对象
  10. 搞笑恶搞彩虹糖的梦—三炮山人组之2人世界