这到题是一个单调栈的题,就是让轮廓的高度依次进栈,如果刚刚进入的高度小于栈顶的高度,就让栈顶出栈,再比较他和栈顶的高度,如果相等则ans++;最后用n-ans得出答案,因为楼全是矩形,所以奶牛看到的n个高度是矩形重叠形成的,所以用看到的总高度数减去重叠的数,就得出有几栋楼了。
原理:
如果有相同高度的出现就证明可以用同一块方块覆盖于是ans++
#include<cstdio>
#include<cstring>
int n,w;
struct asd
{
int x,g;
}a[1000001];
int z[1000001];
int main()
{
memset(a,0,sizeof(a));
memset(z,0,sizeof(z));
scanf("%d %d",&n,&w);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&a[i].x,&a[i].g);
}
int zd=0;
zd++;
z[zd]=a[1].g;
int ans=0;
for(int i=2;i<=n;i++)
{
while(zd>0&&z[zd]>a[i].g)
{
zd--;
}
if(z[zd]==a[i].g)
{
ans++;
}
z[++zd]=a[i].g;
}
if(a[1].g==0)//因为第一块方块如果高度为0不需要找方块覆盖
{
ans++;
}
printf("%d",n-ans);
return 0;
}