题目:codeforces 448CPainting Fence

题意:n个1* a [ i ] 的木板,把他们立起来,变成每个木板宽为1长为 a [ i ] 的栅栏,现在要给栅栏刷漆,刷子宽1,每一刷子可以刷任意长,现在让你求最少需要多少刷子?

分析:题目看似没有头绪,仔细分析的话其实很简单

首先,我们假如每次都刷一个木板,即一竖行,那么需要n次刷完,可见这是一个ans的最大值。就是最差的情况下我这样刷最多为n刷。

其次:如果我们选择一横行的刷,而n个木板中最短的为min,那么我们可以花min刷,把他们都刷成a [ i ] - min的高度,那么剩下来的栅栏又变成了开始的情况,我们可以在选择前面不为0的x个,继续按上面的方法刷,可见是一个递归调用即可。

要特别注意的是前面的条件,就是刷x个木板,最多用x刷,如果某一次求得大于x,那么取x,这样就很easy了。

其实可以归结为:其实最初的思想可以归结为优先横刷,其次竖刷(如果竖刷花费更小),注意一定要仔细。

代码:

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 5500;
int a[N];
int tmp=0,ans=0;
void solve(int s,int t)
{int ma=-1,mi=0x3f3f3f3f;for(int i=s;i<t;i++){if(a[i]>ma)ma=a[i];if(a[i]<mi)mi=a[i];}if(ma==mi){tmp+=min(mi,t-s);return ;}for(int i=s;i<t;i++)a[i]-=mi;mi=min(mi,t-s);tmp+=mi;for(int i=s;i<t;i++){if(a[i]>0){for(int j=i;j<t;j++)  ///枚举连续不为0段{if(a[j]==0 || j==(t-1) &&a[j]>0){if(j==(t-1) && a[j]>0)j++;int kk=tmp;solve(i,j);if(tmp-kk>(j-i)){   //判断如果求得的值比直接一行一行刷更大的话,取更小的tmp=kk+(j-i);}i=j;break;}}}}
}
int main()
{int n;while(~scanf("%d",&n)){for(int i=0;i<n;i++)scanf("%d",&a[i]);tmp=0;ans=0;solve(0,n);printf("%d\n",min(n,tmp));}return 0;
}

codeforces 448CPainting Fence相关推荐

  1. 一起开心集训队第一周训练赛2021/3/14

    文章目录 比赛链接 A CodeForces 1481D AB Graph 题意: 题解: 代码: B CodeForces 1481E Sorting Books 题意: 题解: 代码: C Cod ...

  2. 2022/9/16-2022/9/20

    322B - Ciel and Flowers 有一种情况没有看出来看,不应该,3  5  5的答案应该是4,g和r单独做一个,然后再做上两个mixing的,特判一下这种情况就行:有两个取余为2,另一 ...

  3. CFCC百套计划4 Codeforces Round #276 (Div. 1) E. Sign on Fence

    http://codeforces.com/contest/484/problem/E 题意: 给出n个数,查询最大的在区间[l,r]内,长为w的子区间的最小值 第i棵线段树表示>=i的数 维护 ...

  4. Educational Codeforces Round 73 (Rated for Div. 2) Make The Fence Great Again dp + 结论

    传送门 文章目录 题意: 思路: 题意: 思路: 首先证明一个结论:一个数最多被加两次. 首先假设a[i]=a[i−1]a[i]=a[i-1]a[i]=a[i−1]或a[i]=a[i+1]a[i]=a ...

  5. Codeforces 484E Sign on Fence(是持久的段树+二分法)

    题目链接:Codeforces 484E Sign on Fence 题目大意:给定给一个序列,每一个位置有一个值,表示高度,如今有若干查询,每次查询l,r,w,表示在区间l,r中, 连续最长长度大于 ...

  6. CODEFORCES 484E Sign on Fence

    链接 http://codeforces.com/contest/484/problem/E 题意 给出 n 个宽度为 1 ,高度为 h[i] 的矩形,从 1 到 n 连续挨着排.有 m 次询问,每次 ...

  7. Codeforces Round #165 (Div. 2) A - Fancy Fence

    题目:http://codeforces.com/contest/270/problem/A 输入角度,判断能否构成正多边形 思路:正n边形满足的角满足:angle=(n-2)*180/n #incl ...

  8. Codeforces 448C Painting Fence:分治

    题目链接:http://codeforces.com/problemset/problem/448/C 题意: 有n个木板竖着插成一排栅栏,第i块木板高度为a[i]. 你现在要将栅栏上所有地方刷上油漆 ...

  9. 【CodeForces - 270A】Fancy Fence (几何,思维,水题)

    题干: Emuskald needs a fence around his farm, but he is too lazy to build it himself. So he purchased ...

最新文章

  1. 「每周CV论文推荐」 初学深度学习人脸属性分析必读的文章
  2. 消息队列服务器 轻量,PHP的轻量消息队列php-resque使用说明
  3. C语言字符串函数大全
  4. 在Red Hat 4 AS U7上安装oracle10gR2
  5. git常用命令流程图
  6. 经典排序算法 - 鸡尾酒排序Cocktail sort
  7. ThinkPHP(3.2)搭建简单留言板项目
  8. 用JSON-server模拟REST API(一) 安装运行
  9. 1.C#.Net面向对象基础知识点
  10. [转]最牛MSN签名
  11. 基于SpringBoot开发的后台管理、系统脚手架Github\Gitee收集
  12. logback开启异步打印
  13. 通达OA任意文件删除/未授权访问+任意文件上传漏洞复现
  14. php global 要点
  15. java 弹幕 原理_Flutter 实现虎牙/斗鱼 弹幕效果
  16. 虚拟化技术加速Android模拟器尝试
  17. MessageBox提示框自动关闭
  18. c语言实现1024点fft程序,数字信号处理的步骤与注意事项,并编写1024个采样点的FFT C语言程序...
  19. 计算机视觉中的小样本学习综述
  20. 微软远程桌面(安卓版)连接出现0x204错误的解决办法

热门文章

  1. c语言中哪个键是逐行运行的,c语言中的快捷键有哪些?
  2. 同一网段和不同网段中的两台主机通信的过程
  3. 【MySQL】 update 大量数据批量更新
  4. 使用Android的Service实现后台定时检测并重启应用
  5. stata的固定效应,控制时间和个体的语句
  6. 有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量是0.00001kg,第二个里面放2粒,第三个里面放4,棋盘上放的所有芝麻的重量
  7. yeezy350灰橙_海外媒体指明某平台Yeezy350灰橙的补货为Fake!但这事没那么简单
  8. Nokia 5530XM
  9. java创建简单的学生类_Java创建一个学生类步骤代码分享
  10. 使用Hbuilder开发python