NEFU 1112 粉刷栅栏算法

题目链接

中文题 简单搜索题

例数据

输入 6

1 1 1 1 9 9

输出 3

注意是每一个递归搜索都返回一个min 而不是只有总的返回min

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a[5678];
int dfs(int l,int r,int k)
{
    if(l>r||(l==r&&a[l]<=k)) return 0;
    if(l==r) return 1;
    //注意区间左闭右开 只有这里r+1考虑右边界
    int mn=min_element(a+l,a+r+1)-a;
    //注意-k
    return min(r-l+1,dfs(l,mn-1,a[mn])+dfs(mn+1,r,a[mn])+a[mn]-k);
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
        //区间严格[l,r]
        //如果用0,n注意所有地方都要改
        printf("%d\n",dfs(0,n-1,0));
    }
    return 0;
}
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n,a[100005];
int get(int l,int r)
{
    int minn=1e9+3;
    for(int i=l;i<=r;i++)
    {
        minn=min(minn,a[i]);
    }
    int ans=minn;
    for(int i=l;i<=r;i++)
    {
        if(a[i]==minn)
            continue;
        int ii=i+1;
        while(ii<=r&&a[ii]!=minn)
            ii++;
        ii--;
        for(int j=i;j<=ii;j++)
            a[j]-=minn;
        ans+=get(i,ii);
        i=ii;
    }
    return min(r-l+1,ans);
}
int main()
{
    //freopen("in.txt", "r", stdin);
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        printf("%d\n",get(0,n-1));
    }
    return 0;
}
时间: 2025-01-01 21:13:53

NEFU 1112 粉刷栅栏算法的相关文章

哈理工校赛F题 递归分治

比赛时不会,在小岛的帮助下还是把这道题做出来了 F.粉刷栅栏 Description 给定一组长度为 n 的栅栏,从左到右高度依次是 h[i]. 你需要对这个栅栏粉刷油漆,每次你可以粉刷一行或者一列. 问最少粉刷几次,可以给所有栅栏上漆.(不能多刷) Input 第一行包含一个整数,表示栅栏的长度. 接下来的一行,包含 n 个数(n <= 5000),依次表示 h[i](0 <= h[i]<= 10). Output 输出一行表示对应的答案.. Sample Input 1 5 2 2

【NOIP2016提高A组模拟9.17】序列

题目 分析 首先用\(a_i\)表示达到目标的步数\(B_i-A_i(mod 4)\) 根据粉刷栅栏,先不管mod 4的情况,答案就是\(\sum\max(a_i-a_{i+1},0)\) 那我们刚才做个差分\(a_i-=a_{i+1}\) 当我们给i增加高度, 那么\(a_i-4,a_{i+1}+4\) 当我们给区间增加高度,那么因为中间的+4-4抵消了,所以 \(a_l-4,a_r+4\) 那么我们考虑 \(a_l\)为1.2.3的情况, 就读者私下讨论. #include <cmath>

图形填充之栅栏填充算法

编译器:VS2013 该算法相对边缘填充算法莱说,效率较高来说,选取一个顶点的横坐标为栅栏,将直线和栅栏之间进行填充,如果颜色为背景色,则填充填充色,否则则填充背景色 代码: 1 // 栅栏填充算法.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<stdio.h> 6 #include"graphics.h" 7 #include<stdlib.h> 8 9 //函数声

nefu 663 Emergency(flord算法)

Emergency Time Limit 3000ms Memory Limit 65536K description Kudo's real name is not Kudo. Her name is Kudryavka Anatolyevna Strugatskia, and Kudo is only her nickname. Now, she is facing an emergency in her hometown: Her mother is developing a new ki

1112个人赛,最长回文串常见算法讨论

ps.此贴大部分文字与代码来自网上,我只是取长补短整理了下 S=“c a b a”  那么  S' = “a b a c”, 这样的情况下 S和 S‘的最长公共子串是aba.没有错误. 但是当 S=“abacdfgdcaba”, 那么S’ = “abacdgfdcaba”. 这样S和S‘的最长公共子串是abacd.很明显abacd并不是S的最长回文子串,它甚至连回文都不是. 现在是不是都明白为什么最长回文子串不能转化成为最长公共子串问题了.当原串S中含有一个非回文的串的反序串的时候,最长公共子串

等高线生成算法(转载)

等高线生成算法 输入:离散的采样点坐标和高度值(x_0,y_0,value_0),(x_1,y_1,value_1)......(x_n, y_n, value_n) 输出:等高线图,如下所示 wiki上的Marching squares算法对此有很好的说明,我也是按照wiki上面的步骤来实现这个算法的,下面对该算法的步骤进行简要说明. 输入参数: 1.点的集合(x_0,y_0,value_0),(x_1,y_1,value_1)......(x_n, y_n, value_n) ; 2.高度值

codevs2777 栅栏的木料

题目描述 Description 农民John准备建一个栅栏来围住他的牧场.他已经确定了栅栏的形状,但是他在木料方面有些问题.当地的杂货储存商扔给John一些木板,而John必须从这些木板中找出尽可能多所需的木料. 当然,John可以切木板.因此,一个9英尺的木板可以切成一个5英尺和一个4英尺的木料 (当然也能切成3个3英尺的,等等).John有一把(完美的)梦之锯,因此他在切木料时,不会有木料的损失. 所需要的栅栏长度可能会有重复(比如,一个3英尺和另一个3英尺长的栅栏可能同时都需要).所需要

模板化的七种排序算法,适用于T* vector&lt;T&gt;以及list&lt;T&gt;

最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板纯属于偷懒,更方便于测试代码的有效性,等代码写完也懒得去改了.下面开始介绍这段代码,有什么不对的地方欢迎前来指正. 一共写了七种排序,插入排序InsertSort.堆排序HeapSort.快速排序QuickSort.合并排序MergeSort,计数排序CountingSort,基数排序RadixSo

CSU OJ 1112机器人的指令 (湖南省12年省赛题)

 Welcome to CSU Online Judge! 1112: 机器人的指令 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 274  Solved: 97 [Submit][Status][Web Board] Description 数轴原点有一个机器人.该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置. ·LEFT:往左移动一个单位 ·RIGHT: 往右移动一个单位 ·SAME AS i: 和第i 条执行相同的