zoukankan      html  css  js  c++  java
  • A Famous City

                                                                           A Famous City

                                   Time Limit:7000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

    After Mr. B arrived in Warsaw, he was shocked by the skyscrapers and took several photos. But now when he looks at these photos, he finds in surprise that he isn't even able to point out the number of buildings in it. So he decides to work it out as follows:

    - divide the photo into n vertical pieces from left to right. The buildings in the photo can be treated as rectangles, the lower edge of which is the horizon. One building may span several consecutive pieces, but each piece can only contain one visible building, or no buildings at all.

    - measure the height of each building in that piece.

    - write a program to calculate the minimum number of buildings.

    Mr. B has finished the first two steps, the remaining comes to you.

    Input

    Each test case starts with a line containing an integer n (1 <= n <= 100,000). Following this is a line containing n integers - the height of building in each piece respectively. Note that zero height means there are no buildings in this piece at all. All the input numbers will be nonnegative and less than 1,000,000,000.

    Output

    For each test case, display a single line containing the case number and the minimum possible number of buildings in the photo.

    Example

    Input:
    3
    1 2 3
    3
    1 2 1
    
    Output:
    Case 1: 3
    Case 2: 2
    

    Explanation

    The possible configurations of the samples are illustrated below:

     

    题意:
    一张相片上的很多建筑相互遮住了,根据高低不同就在相片上把一座高楼的可见部分作为一个矩形,
    并用数字描述其高度,若一张相片上的两个建筑群中间有空地,高度则为0;求最少有多少个建筑;
    思路:
    1 2 1最少为2座,因为2把1挡住了,而3 1 3则为3座,1挡不住3;
    如:1 2 3 1 2 3 0 1
    输入的0不是建筑,则输入的总个数减去0的个数就是最多可能有的建筑数,设为s;
    再从第一个开始从前往后搜,若发现比它高的则继续搜,若发现比它低的则说明它是一个独立的建筑,
    这时可以返回搜其它的;若与它相等,说明这时它们还没有出现比它们低的建筑,则视其为同一个建筑,
    则sum减1;

    代码:

     

    #include<stdio.h>
    int main()
    {
        int n,a[100001],t,i,j,k,sum;
        t=1;
        while(~scanf("%d",&n))
        {
            sum=n;
            for(i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
            } 
            for(i=0;i<n;i++)
            {
                if(a[i]==0)
                   sum--;
                else 
                {
                   for(j=i+1;j<n;j++)
                   {
                      if(a[i]>a[j])
                        break;
                      else if(a[i]==a[j])
                     {
                         sum--;
                         break;
                     }
                   }
                }
            }
            printf("Case %d: ",t++);
            printf("%d
    ",sum);    
        }
        return 0;
    }

     

     

     

  • 相关阅读:
    2020牛客暑期多校训练营(第八场)解题报告
    2020牛客暑期多校训练营(第七场)解题报告
    2020 Multi-University Training Contest 3 解题报告
    2020牛客暑期多校训练营(第五场)解题报告
    2020 Multi-University Training Contest 2 解题报告
    Android应用开发基础 学习笔记(一)
    Java基础:JUC包学习笔记
    Java基础:枚举学习笔记
    Java基础:反射学习笔记
    Java基础:Stream流学习笔记
  • 原文地址:https://www.cnblogs.com/lipching/p/3850580.html
Copyright © 2011-2022 走看看