CF448CPainting Fence
来源:互联网 发布:webdriver java testng 编辑:程序博客网 时间:2024/06/11 15:10
这道题用到了分治思想和递归调用,每次找到一段区间中最小值的位置,然后不断递归,找到单个元素,跟上层的最小高度比较,如果大于上层最小高度,说明不能刷完,还需要用一次机会,所以返回1,如果小于等于,就不需要在浪费机会了,合并的时候加上本区间最小高度,减去上层区间的最小高度,跟本区间所有竖着刷比较,取较小的值。
#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;int a[6000];int dfs(int l,int r,int last_min_heigh) //l,r分别代表区间左右边界,l_m_h代表上层的最小高度{ if(l>r) return 0; else if(l==r) //如果区间内只有一个元素 { if(a[l]<=last_min_heigh) //判断该元素高度是否大于上层的最小高度 return 0; //如果大于则许多费一次机会,如果不大于就返回0 else return 1; } int m=min_element(a+l,a+r+1)-a; //m_e这个函数有左闭右开的特点,找到区间内的最小元素位置 return min(r-l+1,dfs(l,m-1,a[m])+dfs(m+1,r,a[m])+a[m]-last_min_heigh);} //r-l+1代表最坏都竖着刷的结果,分治分界点m左右的情况,然后合并,加上本区间中最小高度,减去上层最小高度int main(){ int n; while(scanf("%d",&n)!=EOF) { for(int i=1; i<=n; i++) { scanf("%d",&a[i]); } int ans=dfs(1,n,0); printf("%d\n",ans); } return 0;}
0 0
- CF448CPainting Fence
- fence
- Fence
- Fence
- Fence
- Memory Fence
- Electric Fence
- poj1031 fence
- Memory Fence
- Electric Fence
- Fancy Fence
- Fence Repair
- Fence Repair
- Fence Repair
- Electric Fence
- Fence Loops
- Fence Rails
- B. Fence
- 程序员生存定律[七] 表达背后的力量
- xmanager 连接RedHat6 服务器配置
- VS2008中LIB和DLL的创建及调用
- POJ1654-Area
- oracle中创建恢复目录
- CF448CPainting Fence
- 2014新生暑假个人排位赛02 D. 学姐逗学弟
- Vs2012 编译 GDAL 1.11.0
- Page.ClientScript.RegisterStartupScript用法小结
- POJ2236 Wireless Network
- IPOPT工具解决非线性规划最优化问题使用案例
- 杭电 1548 A strange lift(广搜)
- Windchill9.1官方帮助文档
- 更改eclipse tomcat jvm heap