Description
Input
第1行:2個用空格隔開的整數N和W.
第2到N+1行:每行包括2個用空格隔開的整數x,y,其意義如題中所述.輸入中的x嚴格遞增,並且第一個z總是x.
Output
輸出一個整數,表示城市中最少包含的建築物數量.
Sample Input
10 26
1 1
2 2
5 1
6 3
8 1
11 0
15 2
17 3
20 2
22 1
INPUT DETAILS:
The case mentioned above
Sample Output
6
題解:
用單調棧來維護,橫着的行並沒有什麼用,只需考慮豎着的列即可,求出可以減少的覆蓋量,可以減少的情況是指在兩列的高度是相同的(因爲覆蓋的樓是矩形),並且兩列之間沒有比他們高度小的,當單調棧退棧時,若有此種情況,那麼計數器++,最後ans爲n-計數器(因爲最差的情況是用n個才能解決) 代碼如下:
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
const int MAXN=1000001;
int s[MAXN];
int main(int argc, char *argv[])
{
int n,a,b,top=0,cnt=0,t,w;
scanf("%d%d",&n,&w);t=n;
s[++top]=0;
while(t--)
{
scanf("%d%d",&a,&b);
while(b<=s[top]&&top)
{
if(b==s[top]) cnt++;
top--;
}
top++;
s[top]=b;
}
printf("%d\n",n-cnt);
return 0;
}