最大的划分
来源:互联网 发布:大数据开发 编辑:程序博客网 时间:2024/05/17 03:50
题目详情:
有一排高度依次为H1,H2,H3,....,Hn的树木,一共n棵树,如果某棵树(不含两端的树)比相邻的两棵树都要高,则这样的树就称为景点树,现在管理员要将这n棵树划分成连续等长的部分进行管理,并且每部分之中至少含有一棵景点树。管理员希望划分的部分个数最大,你能帮助他吗?
输入描述:
有多组测数数据,每组数据有两行,第一行包含一个正整数n(0<n<100000),第二行包含n个正整数,分别表示H1,H2,H3,....,Hn,(0<Hi<2^30)。
输入以文件结束。
输出描述:
对于每组数据,输出相应的答案。
答题说明:
输入样例:
12
1 2 3 4 3 4 1 2 3 4 6 2
3
1 2 1
3
1 1 1
输出样例:
3
1
0
又一次犯了冒进的错误,打了一半的代码发现自己没有完全理解题目,于是又瞎了。。。
到了下午更是在自己正在看的一本书中发现这是一道类型题,更是泪流满面。活用二分法,记住了!
#include<iostream>#include<fstream>using namespace std;const int N = 100100;int hs[N];int n;bool test(int x){ bool sign = false; int len = n / x; for(int i = 1; i < n - 1; i++){ if(i % len == 0){ if(sign == false){ return false; } else { sign = false; } } if(hs[i] > hs[i - 1] && hs[i] > hs[i + 1]){ sign = true; } } return sign;}int main(void){ int tc = 0; while(!cin.eof()){ cin >> n; char c; for(int i = 0; i < n; i++){ cin >> hs[i]; } int l = 0, r = n; while(l < r - 1){ int mid = (l + r) / 2; int backup = mid; while(mid < r && n % mid > 0){ mid++; } if(mid == r){ r = backup; } else if(test(mid)){ l = mid; } else { r = mid; } } cout << l << endl; } return 0;}
0 0
- 最大的划分
- 最大的划分
- POJ 3258 (固定划分的最大距离)
- 区间DP 最大面积最小的三角形划分
- 求正整数n划分因子乘积最大的一个划分及此乘积
- 【划分型DP】乘积最大
- 将n划分成最大数不超过m的划分数
- NYOJ 746 - 正整数n划分为m段,求m段的最大乘积 【区间DP】
- hdu1024 最大m段和 划分dp
- <划分型DP>【noip 2000】乘积最大
- 数据库的垂直划分和水平划分
- 数组划分 求划分结果的差值
- 数据库的垂直划分和水平划分
- 数据库的垂直划分和水平划分
- 数据库的垂直划分和水平划分
- 数据库的垂直划分和水平划分
- 数据库的垂直划分和水平划分
- 数据库的垂直划分和水平划分
- 安卓Android系统超级终端(终端模拟…
- Ubuntu下如何在桌面创建一个桌面快捷方式
- Rock, Paper, or Scissors? 2164
- Android IPC编程简介
- linux 编码转换
- 最大的划分
- linux查找文件内容的命令
- 解决 Eclipse项目红感叹号(或×号)
- Android高手进阶
- c++之this指针做参数实现对象间的交互实例
- 存储过程的入门使用
- Chrome(谷歌浏览器) 程序开发32个常用插件
- unity3d自定义鼠标
- Android MimeType的用途以及所有类型