「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;
}