题意:
这道题的题意完全看不懂,看懂了就瞬秒了,简单来说,就是用尽可能少的矩形覆盖所有区域,这样的话其实只有矩形的高度会造成影响,和先前高度一样的可以并在一起
做法:具体来说就是维护一个单调递增栈,大于或者空的且非0就直接丢进去,小于就一直弹栈同时计数,等于的因为可以并在一起直接不管,最后再全部弹出来计数一次就好了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
int st[maxn];
int main()
{
int n,f=0;
while(~scanf("%d",&n))
{
int x,top=0,ans=0;
for(int i=1;i<=n;++i)
{
scanf("%d",&x);
while(top!=0&&st[top]>x)
ans++,top--;
if(top==0||st[top]<x)
if(x!=0)
st[++top]=x;
}
while(top!=0)
top--,ans++;
printf("Case %d: %d\n",++f,ans);
}
return 0;
}