题意:给定一组照片是拍摄的一串楼的高度,求最少有多少个楼
解析:例如数据121 可以认为高度为1的楼长度为3,高度为2的长度为1,然后中间挡住了高度为1的,所以答案是2.在看2 1 2答案是3,因为中间的1无法挡住两边的2所以2是分开的楼
使用 set 依次来存储 大厦的高度,set 的作用判断高度当前的高度有没有出现过,如果没出现则 ans++ ,否则依次查找这个这个元素之间的所有元素,有没有比他小的。
此题关键是理解题意
#include<iostream>
#include<cstdio>
#include<set>
#define N 1000010
using namespace std;
int a[N];
set<int>S;
set<int>::iterator it;
int main()
{
int n,ans,i,j,k=1;
while(scanf("%d",&n)!=EOF)
{
S.clear();
for(i=0;i<n;i++)
scanf("%d",&a[i]);
ans=0;
for(i=0;i<n;i++)
{
if(a[i]==0) continue;
it=S.find(a[i]);
if(it==S.end())
{
ans++;
S.insert(a[i]);
}
else
{
j=i-1;
while(0<=j&&a[j]!=a[i])
{
if(a[j]<a[i])
{
ans++;break;
}
j--;
}
}
}
printf("Case %d: %d\n",k++,ans);
}
return 0;
}