昨晚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. 一次次小进步,从毕业开始,你到现在飞跃了几次了,程序人生也不容易?
  2. BigData/Cloud Computing:购买并登录Windows弹性云服务器之详细攻略(图文教程)—更优惠、更贴心!
  3. JVM中垃圾回收相关算法 - 值得了解一下的,因为早晚得了解
  4. DCMTK:Irradiation事件识别测试FG类
  5. 2016年第2本:选择的悖论
  6. 网页文件都是php怎么修改,请问你们怎么将html的文件的内容改变为php
  7. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 26丨广告效果【难度简单】​
  8. 典型的SPI控制器的结构
  9. 11.策略模式(Strategy Pattern)
  10. 4 angular 重构 项目_TypeScript项目开发实战 | 撸起来
  11. 关于使用JAVA进行MIB文件解析
  12. STM32固件库的下载
  13. SWAT模型中土壤水文分组的一些思考
  14. UTD2202C示波器如何显示峰峰值
  15. 三角函数正交性理解与Matlab分析
  16. qualifiers
  17. uni-app数据缓存
  18. 数字营销中台和全渠道的数字化精耕,快消老品牌实现数字营销焕新生
  19. OpenLayers 3实践与原理探究1-ol2 VS ol3
  20. Fortify扫描漏洞解决方案

热门文章

  1. c 调用 android jar包,Unity调用AndroidStudio导出的Jar包
  2. [USACO14OPEN]Fair Photography【前缀和】
  3. [人脸识别]什么叫One-shot learning
  4. iOS 协议 委托 代理 delegate
  5. nginx+lua+redis实现post请求接口之黑名单(一)
  6. 沃兹批评苹果避税:纳税还不如我积极
  7. 如何启用或禁用错过的呼叫skype for business通知
  8. linux应用编程之进程间同步
  9. 从零开始学wordpress 之四
  10. Oracle Decode()函数和CASE语句的比较