Codeforces Round #703 (Div. 2) C. Guessing the Greatest
C1. Guessing the Greatest (easy version)
C2. Guessing the Greatest (hard version)
Codeforces C题Guessing the Greatest分为easy和hard两个版本,唯一区别在于对询问次数的限制,以下给出easy版本的题面
Example
input
5
3
4
output
? 1 5
? 4 5
! 1
题目大意
给定一个长度为n的数组,数组中的元素都不相同,每次可以询问[l,r] (l<r)区间内第二大数的位置,在限定询问次数内,找出最大数的下标位置。
分析
两个版本的基本思路都是二分,hard版本限定的询问次数更少
设答案所在的区间是[l,r],中点为mid,第二大数所在位置是smax
easy version
先询问[l,r],如果smax<=mid,再询问[l,mid],如果再次询问第二大数的位置还是smax,说明最大数所在区间为[l,mid],反之最大数所在区间为[mid+1,r],smax>mid的情况同理。这样通过两次询问就可以将答案的区间缩小一半,通过计算,最大询问次数为2*⌈log2105⌉=34
hard version
首先询问[1,n],确定第二大数的位置smax,如果smax>1,再询问[1,smax],如果第二大数的位置不变,说明最大数所在区间为[1,smax-1],否则最大数所在区间为[smax+1,n],通过不超过两次的询问确定smax和最大值所在位置的大小关系,便于下一步判断。以最大值所在区间为[1,smax-1]为例,此时l=1,r=smax-1,中点为mid,每次询问[mid,smax],如果第二大数的位置仍为smax,说明最大数在[mid,smax-1],只需让l=mid,否则r=mid-1,最大值在区间[smax+1,n]的情况是类似的。通过计算,这种方法的最大询问次数为2+⌈log2105⌉=19
AC代码
easy version
#include <bits/stdc++.h>
using namespace std;typedef long long ll;int ask(int l,int r)
{if(l>=r) return 0;int x;cout<<"? "<<l<<" "<<r<<endl;cin>>x;return x;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin>>n;int l=1,r=n;int x,y;while(l<r){if(r-l==1){x=ask(l,r);if(x==l) l=r;break;}int mid=(l+r)>>1;x=ask(l,r);if(x<=mid){y=ask(l,mid);if(y==x) r=mid;else l=mid+1;}else{y=ask(mid+1,r);if(y==x) l=mid+1;else r=mid;}}cout<<"! "<<l<<endl;return 0;
}
hard version
#include <bits/stdc++.h>
using namespace std;typedef long long ll;int ask(int l,int r)
{int num;cout<<"? "<<l<<" "<<r<<endl;cin>>num;return num;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;cin>>n;int x,y;int l,r;x=ask(1,n);if(x!=1) y=ask(1,x);if(y!=x||x==1){l=x+1,r=n;while(l<r){int mid=(l+r)>>1;if(ask(x,mid)!=x) l=mid+1;else r=mid;}}else{l=1,r=x-1;while(l<r){int mid=(l+r+1)>>1;if(ask(mid,x)!=x) r=mid-1;else l=mid;}}cout<<"! "<<l<<endl;return 0;
}
注意
1.在easy version中如果r-l==1,此时[l,r]已经是可以询问的最小区间,只需一次询问便可确定最大值的位置,这种情况单独判断
2.在hard version中,两种情况下mid的取值有所差别,mid=(l+r)>>1还是mid=(l+r+1)>>1与区间二分时l,r的取值有关
Codeforces Round #703 (Div. 2) C. Guessing the Greatest相关推荐
- Codeforces Round #703 (Div. 2)C1C2 Guessing the Greatest(二分)
题意: 交互题. query l,r区间内第二大的数,要求得到整个数组最大的数. 思路:首先我们对整体数组进行query 找到第二大的数所在的位置,设这个位置为p. 然后分别对[1,p]和[p,n]进 ...
- Codeforces Round #703 (Div. 2)
Codeforces Round #703 (Div. 2) 题号 题目 知识点 A Shifting Stacks 思维 B Eastern Exhibition 思维 C1 Guessing th ...
- Codeforces Round #703 (Div. 2) 题解
文章目录 A. Shifting Stacks B. Eastern Exhibition C. Guessing the Greatest D. Max Median E. Paired Payme ...
- Codeforces Round #703 (Div. 2)(A ~ F)超高质量题解【每日亿题2 / 19】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A. Shifting Stacks B - Eastern Exhibition C1 - G ...
- Codeforces Round #703 (Div. 2) A-E 题解
Shifting Stacks 给你 n 长度的数组,每个下标包含 000-nnn 个木块 其中可以将某一位置的木块向右边平移 请问是否能凑出高度严格上升的数组 一开始想简单了 直接判断木块的和是否大 ...
- Codeforces Round #703 (Div. 2) Guessing the Greatest C1 C2 二分
link 题意:交互题,每次可以询问一个区间的次大值,保证所有值都不相同,求最大值位置.easy是询问最多40次,hard最多20次. 交互题大部分都是二分,可以向二分考虑. easy比较好想,假设当 ...
- Codeforces Round #703 (Div. 2) E. Paired Payment 最短路 + 思维
link 题意: 给一张图,每次只能一下走两个点,比如当前在aaa,往下走到bbb再到ccc,权值为(wa,b+wb,c)2(w_{a,b}+w_{b,c})^2(wa,b+wb,c)2.求1到其 ...
- Codeforces Round #703 (Div. 2) B.Eastern Exhibition 中位数结论
link 题意: 给n个点,求有多少个点到所有点距离之和最小. 中位数结论题了,可以考虑一维的情况,让后二维的话乘起来就好啦. //#pragma GCC optimize(2) #include&l ...
- Codeforces Round #703 (Div. 2) D . Max Median 二分 +思维
传送门 题意: 给定一个数组和k,求一段连续区间中位数最大值,连续区间长度>=k. 如果=k的话可以直接秒了,这里是>=k,我们可以通过二分让后利用>=k这个条件来检查答案. 二分中 ...
最新文章
- 想 new 个对象过七夕,她却抛了异常
- java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)
- 【手记】解决启动SQL Server Management Studio 17时报Cannot find one or more components...的问题
- 【Linux】35. python脚本重命名各子目录下的图片
- 使用ALV中输出ICON
- GPRS底层API(转)
- java 不支持fork,grails不能运行fork模式解决方法
- R语言学习 - 非参数法生存分析
- oracle出现12505错误的解决步骤
- SpringBoot2.0.3 + SpringSecurity5.0.6 + vue 前后端分离认证授权
- 解决IE浏览器URL乱码的问题
- 解决centos7 ssh连接慢的问题
- flashfxp修改服务器密码,flashfxp服务器端设置
- 解决 mac系统下sublime imput 函数交互问题
- 重读微积分(八):全微分和法线
- 深度走心字节跳动内推
- 拼多多又起一事:因为看到同事被抬上救护车我被拼多多开除了
- 计算机桌面壁纸小,电脑的桌面壁纸大小怎么设置
- HTML 设置背景图片自适应
- 简单理解XHR、Ajax、Axios、Promise