[AGC006D] Median Pyramid Hard 题目分析
1.P1779 魔鬼杀手 题解&&思路2.SP15637 GNYR04H - Mr Youngs Picture Permutations 解析3.P10954 LCIS 题目解析4.P2893 [USACO08FEB] Making the Grade G 题目分析5.P10972 I-Country 题目分析6.SP703 SERVICE - Mobile Service 题目分析7.整数划分 题目分析以及衍生出来的一系列做法8.UVA1482 Playing With Stones 题目分析9.P2575 高手过招 题目分析10.P6815 [PA2009] Cakes 题目分析
11.[AGC006D] Median Pyramid Hard 题目分析
[AGC006D] Median Pyramid Hard 题目分析
评价
一道非常好的思维题目!!!
分析
注意到:从三个数选一个中位数。
似乎没有什么好的方法,但是每一层的迭代有一种相似方法。
我们假设一个答案。
将大于等于答案的标记为
三——一个非常重要的数,我们要考虑以下:
全是0:000 -> 0
一个1:001 -> 0
两个1:101 -> 1
三个1:111 -> 1
我们发现得到的答案取决于数量(
那我们怎么确定他能一直走到尾呢?
注意到:
??? -----> 00?
x00zy x00zy
也就是说,两个连续的在一起,能够使得上面也一样(但是要看边界)。
注意到要是中间有连续的(即最靠近中间的一段
我们发现这样具有单调性,于是乎可以考虑二分答案解决。
然后我们就很好的解决了该问题。
总时间复杂度
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
#include <vector>
#define N 100005
using namespace std;
int a[N << 2],n,b[N << 2];
bool check(int x) {
for (int i = 1;i <= 2 * n - 1;i ++) b[i] = (a[i] >= x);
for (int dis = 0;dis < n - 1;dis ++) {
if (b[n + dis] == b[n + dis + 1]) return b[n + dis];
if (b[n - dis] == b[n - dis - 1]) return b[n - dis];
}
return b[1];
}
signed main(){
cin >> n;
for (int i = 1;i <= 2 * n - 1;i ++) cin >> a[i];
int l = 1,r = 2 * n - 1,res = r;
while(l <= r) {
int mid = l + r >> 1;
if (check(mid)) res = mid,l = mid + 1;
else r = mid - 1;
}
cout << res;
return 0;
}
拓展:如何去掉
我们可以通过二分算法得到线性算法,这是一个好方法。
我们发现我们得到一个对的值那么我们只需要扫一遍就可以了。那么这个对的值就是
本文作者:high-sky
本文链接:https://www.cnblogs.com/high-sky/p/18705960
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
,
,
标签:
,
,
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步