昨晚CF碰到的题目,昨晚CF跪了啊啊啊

题意比较简单,给定一排挨在一起的板子,宽度都为1,高度不一,一个刷子宽度也是1,可以横着刷,也可以竖着刷,但是任何时刻刷子都要在板子上,也就是说,如果横向的时候,出现断层,就要算2次或者多次了 最后求全部刷完的最小刷的次数

昨晚真的是想了各种方法,dp也想了,二分结果也想了,主要是他这个到了高处,互相不连通的时候,也不好怎么搞。

好吧,进入正题,最后是用分治解决,也有说是dp的,其实也可以说是dp,毕竟分治本身也是种dp思想,我大dp果然是无穷无尽。

这个分治有点像区间dp,先从这个区间开始,最大值肯定是 r-l+1不,然后找到最矮的板子,就把他横向刷掉,然后往该板的两边继续递归,每次比较 竖向刷最大值 和 横向刷最矮板子中最小的,因为每次都是刷最小的,所以不会出现断层的现象,而且横向要么就不刷,刷的话肯定至少把最小的要刷掉,如果连最小的都没刷掉,不是白刷了。

板子最多只有5000块,因此每次至少刷掉了一块板子,所以整个dfs不会超过5000次。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int A[5010];
int n;
int solve(int l,int r,int h)
{if (l>r) return 0;int loc=-1,mini=1<<30;int sum=0;for (int i=l;i<=r;i++){if (mini>A[i]){mini=A[i];loc=i;}if (A[i]>h) sum++;}//if (loc==-1) return 0;int tmp=A[loc]-h; //即使当前最小板子已经被刷过了,也要继续递归下去,因为还可能有其他板子没刷到,h代表当前已经刷到的高度。if (tmp<0) tmp=0;return min(sum,solve(l,loc-1,max(A[loc],h))+solve(loc+1,r,max(A[loc],h))+tmp);
}
int main()
{// cout<< (1<<30)<<endl;while (scanf("%d",&n)!=EOF){for (int i=1;i<=n;i++) scanf("%d",&A[i]);int ans=solve(1,n,0);printf("%d\n",ans);}return 0;
}

  

转载于:https://www.cnblogs.com/kkrisen/p/3854337.html

Codeforces_448C 分治相关推荐

  1. 分治算法的设计思想(二分检索、二分归并排序)

    分治策略思想: 将原问题划分或者归结为规模较小的子问题. 递归或迭代求解每一个问题. 将子问题的解综合得到原问题的解. 性质: 子问题与原问题具有相同的性质. 子问题的求解彼此独立. 划分时子问题的规 ...

  2. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  3. (2016北京集训十)【xsy1529】小Q与进位制 - 分治FFT

    题意很简单,就是求这个数... 其实场上我想出了分治fft的正解...然而不会打...然后打了个暴力fft挂了... 没啥好讲的,这题很恶心,卡常卡精度还爆int,要各种优化,有些dalao写的很复杂 ...

  4. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

    这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...

  5. 算法设计与分析第2章 递归与分治策略

    第2章 递归与分治策略 2.1 递归算法 递归算法:直接或间接地调用自身的算法. 递归函数:用函数自身给出定义的函数.两个要素:边界条件.递归方程 优点:结构清晰,可读性强,而且容易用数学归纳法来证明 ...

  6. 1164: 分治 逆序对

    1164: 分治 逆序对 时间限制: 1 Sec  内存限制: 128 MB 题目描述 给一列数a1,a2,...,an,求它的逆序对数,即有多少个有序对(i,j),使得i<j且ai>aj ...

  7. 递归/分治:归并排序

    前言 分治算法: 将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出 子问题的解后进行合并,就可得到原问题的解. 步骤如下: 分解,将要解决的问题划分成若 干规 ...

  8. 求排列的逆序数(分治)

    考虑1,2,-,n (n <= 100000)的排列i1,i2,-,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序. 一 ...

  9. 2018.3.15校内互测总结-点分治-线段树

    这是曾来过咱们学校集训的一位大神出的~ T1 题目大意 给出一棵带边权的无根树,求树上前$k$大的路径的长度. $1 \leq n \leq 200000$ 题解 想了一上午点分治,却发现只会$O(n ...

最新文章

  1. FFmpeg简介及在vc2010下编译步骤
  2. Python | numpy | np.split()与np.array_split()函数
  3. python 学习手册重点
  4. Eclipse导入Zookeeper源码Version2017.11.3
  5. 八皇后问题的非递归解法
  6. (转)Spring Boot(九):定时任务
  7. 硬盘安装Debian
  8. 开源三维地球Cesium中如何离线加载卫星影像和高程DEM数据
  9. 智齿客服网页端接入文档V2.3
  10. win10 永久关闭自动更新
  11. 刚刚装好的ppt插件islide消失了,如何解决呢?
  12. 外盘国际期货是否合法吗?为啥还有人做期货主账户?
  13. 轻松掌握辗转相除法(原理+俩道简单编程题详解)
  14. 《高效程序员的45 个习惯》读书笔记
  15. iview的checkbox
  16. 小波基函数的选择和小波构造
  17. 2021ICPC西安邀请赛赛后总结
  18. 数据结构第二版(朱昌杰版)第四章:习题4
  19. 机器学习 李宏毅 L32-Structured Learning-Introduction
  20. 【NOIP2017提高A组集训10.30】总结

热门文章

  1. python将jwths256加密——pyjwt库
  2. 文本分类 - 样本不平衡的解决思路与交叉验证CV的有效性
  3. R+NLP︱text2vec包——四类文本挖掘相似性指标 RWMD、cosine、Jaccard 、Euclidean (三,相似距离)
  4. [spring]spring boot项目实例
  5. 多线程编程下单例模式与多例模式的使用总结
  6. 给初学者的RxJava2.0教程(三)
  7. Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url
  8. 淘宝SOA框架dubbo学习(4)--参数验证
  9. MathType几个常用字体的名称
  10. Java基础-控制流程-5. 中断控制流程语句