「NOIP模拟赛 陆」Steins题解

「NOIP模拟赛 陆」Steins

题意

给出一个给出\(N\)个长度为\(1\)高度为\(H_i\)的矩形,原来矩形上是没颜色的,每次能横着刷或竖着刷。但不能刷到图形外面去,问最少刷几次能将整个图形刷完。

solve

分析题目可以发现答案肯定不会超过\(N\),因为竖着刷\(N\)次肯定能刷完。
于是我们就会想到横着刷。如图

横着刷肯定一排刷完好,反正ans又不会增加。其次,横着刷得越多越好。因为如果刷了蓝色部分的,红色部分还要至少\(N\)次才能刷完。
所以能刷几条横着的就刷。
我们发现横着刷完后把图形分成几个小的图形,就是白色部分,把白色部分当做一个图形来处理,自然而然就想到了分治。

code

#include<bits/stdc++.h>
using namespace std;
int n;
#define ll long long
ll a[5009];
ll solve(int l,int r,ll high){
    if(l==r) return 1;
    ll ans,mn=-1,tmp=r-l+1;
    for(int i=l;i<=r;i++)
        if(mn==-1 || mn>a[i]) mn=a[i];
    ans=mn-high;
    for(int i=l;i<=r;i++)
    {
        int pos;
        if(a[i]==mn) continue;
        for(int j=i;j<=r;j++)
        {
            pos=j; 
            if(j==r || a[j+1]==mn) break;
        }
        ans+=solve(i,pos,mn);
        i=pos+1;
    }
    return min(tmp,ans);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    printf("%lld",solve(1,n,0));
    return 0;
}   

猜你喜欢

转载自www.cnblogs.com/booksBlog/p/12294783.html