zoukankan      html  css  js  c++  java
  • Codeforces 448C:Painting Fence 刷栅栏 超级好玩的一道题目

    C. Painting Fence
    time limit per test
    1 second
    memory limit per test
    512 megabytes
    input
    standard input
    output
    standard output

    Bizon the Champion isn't just attentive, he also is very hardworking.

    Bizon the Champion decided to paint his old fence his favorite color, orange. The fence is represented as n vertical planks, put in a row. Adjacent planks have no gap between them. The planks are numbered from the left to the right starting from one, the i-th plank has the width of 1 meter and the height of ai meters.

    Bizon the Champion bought a brush in the shop, the brush's width is 1 meter. He can make vertical and horizontal strokes with the brush. During a stroke the brush's full surface must touch the fence at all the time (see the samples for the better understanding). What minimum number of strokes should Bizon the Champion do to fully paint the fence? Note that you are allowed to paint the same area of the fence multiple times.

    Input

    The first line contains integer n (1 ≤ n ≤ 5000) — the number of fence planks. The second line contains n space-separated integersa1, a2, ..., an (1 ≤ ai ≤ 109).

    Output

    Print a single integer — the minimum number of strokes needed to paint the whole fence.

    Sample test(s)
    input
    5
    2 2 1 2 1
    
    output
    3
    
    input
    2
    2 2
    
    output
    2
    
    input
    1
    5
    
    output
    1
    
    Note

    In the first sample you need to paint the fence in three strokes with the the first stroke goes on height 1 horizontally along all the planks. The second stroke goes on height 2 horizontally and paints the first and second planks and the third stroke (it can be horizontal and vertical) finishes painting the fourth plank.

    In the second sample you can paint the fence with two strokes, either two horizontal or two vertical strokes.

    In the third sample there is only one plank that can be painted using a single vertical stroke.


    题意是给出了一堆栅栏的高度,要求是把这些栅栏都涂满。

    刷子只能是一个方向,可以竖着把一块板子都刷完,也可以横着把几块板子刷一节。问最少需要刷几次能把所有板子都刷完。

    超级好玩的一道题,一开始二分着分治,发现有一些情况无法处理 01110 与11010,向上传递的时候,不知道是max还是求和。感觉这道题线段树也是可以做的。后来发现好玩的地方在于每次都找最小值那里切割就好了,然后每一轮都记录已经刷了的高度,最多就是区间长度,两者比较得出结果。

    代码:

    #include <iostream>  
    #include <algorithm>  
    #include <cmath>  
    #include <vector>  
    #include <string>  
    #include <cstring>  
    #pragma warning(disable:4996)  
    using namespace std;
    
    int n;
    int val[5005];
    
    int dfs(int ll, int r,int height)//前两个参数代表所要刷的区间,最后一个参数代表已经刷的高度
    {
        //从最小值那里分治,而不是二分区间,这点没有想到
    
        if (ll > r)
            return 0 ;
        int min_value = 1e9 + 7;
        int i, pos, sum;//记录当前区间的最小值和位置。然后看现在区间内有多少栅栏是大于所刷高度的,这个值就是最多刷的次数,即竖着刷
    
        sum = 0;
        for (i = ll; i <= r; i++)
        {
            if (val[i] < min_value)
            {
                min_value = val[i];
                pos = i;
            }
            if (val[i] > height)
                sum++;
        }
        int temp = min_value - height;
        return min(sum, dfs(ll, pos - 1, val[pos]) + dfs(pos + 1, r, val[pos]) + temp);
    }
    
    int main()
    {
        int i, res;
        scanf("%d", &n);
    
        for (i = 1; i <= n; i++)
            scanf("%d", val + i);
    
        res = min(n, dfs(1, n, 0));
    
        printf("%d
    ", res);
        //system("pause");
        return 0;
    }



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    南京网络赛题解 2018
    ACM 第二十天
    存储型XSS漏洞(pikachu)
    XSS跨站脚本(pikachu)——反射型xss(get和post)
    暴力破解(pikachu)——防范措施(简单了解)
    暴力破解02(pikachu)——验证码
    暴力破解01(pikachu)——基于表单
    安全软件burp suite pro破解版(亲测有效)
    sql lab的基础配置和1-4关闯关攻略(建议自学MySQL语言后再观看)
    sql lab的环境配置以及火狐浏览器的使用
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4899508.html
Copyright © 2011-2022 走看看