CCF CSP 中國計算機學會-CCF計算機軟件能力認證(計算機水平測試)- 最大的矩形- 201312-3

問題描述

試題編號: 201312-3
試題名稱: 最大的矩形
時間限制: 1.0s
內存限制: 256.0MB
問題描述:

問題描述

  在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i(1 ≤ i ≤ n)個矩形的高度是hi。這n個矩形構成了一個直方圖。例如,下圖中六個矩形的高度就分別是3, 1, 6, 5, 2, 3。




  請找出能放在給定直方圖裏面積最大的矩形,它的邊要與座標軸平行。對於上面給出的例子,最大矩形如下圖所示的陰影部分,面積是10。

輸入格式

  第一行包含一個整數n,即矩形的數量(1 ≤ n ≤ 1000)。
  第二行包含n 個整數h1, h2, … , hn,相鄰的數之間由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i個矩形的高度。

輸出格式

  輸出一行,包含一個整數,即給定直方圖內的最大矩形的面積。

樣例輸入

6
3 1 6 5 2 3

樣例輸出

10

解題思路:

1. 從第一個塊開始,逐漸加入塊,如果加入後值大於當前最大值,則更新最大值,直到無塊可加;

2. 然後從第二個塊開始加入,逐漸加入塊,如果加入後值大於當前最大值,則更新最大值,直到無塊可加;

3. 一直循環,全部循環之後的當前最大值,即爲全局最大值。

代碼:

#include <stdio.h>
#include <string.h>
void doit(char sign[],char (*ch)[101],int n,int flag);
void pipeiwithout(char sign[],char ch[]);
void pipei(char sign[],char ch[]);
int main() {

    char sign[101],ch[100][101];
    int i,flag,n;
    gets(sign);
    scanf("%d%d",&flag,&n);
    getchar();

    for(i=0;i<n;i++)
        gets(ch[i]);
      doit(sign,ch,n,flag);
    return 0;
}
void doit(char sign[],char (*ch)[101],int n,int flag){
    int l=strlen(sign);
    int i,j;
    if(flag==1){
        for (i = 0;i< n;++i) {
           pipei(sign,ch[i]);
        }
    }
    else{
        for (i = 0;  i< n; ++i) {
            pipeiwithout(sign,ch[i]);
        }
    }
}
void pipei(char sign[],char ch[]){
      int f=0,i,j,ls=strlen(sign),lc=strlen(ch);
      for(i=0;i<lc-ls+1;i++){
          f=0;
          for(j=0;j<ls;j++){
              if(sign[j]==ch[i+j]){
                  f++;
              } else{
                  break;
              }
          }
          if(f==ls)
              break;
      }
    if(f==ls){
        puts(ch);
    }
}
void pipeiwithout(char sign[],char ch[]){
    int f=0,i,j,ls=strlen(sign),lc=strlen(ch);
    for(i=0;i<lc-ls+1;i++){
        f=0;
        for(j=0;j<ls;j++){
            if((sign[j]==(ch[i+j]-('a'-'A')))||(sign[j]==(ch[i+j]-('A'-'a')))||sign[j]==ch[i+j]){
                f++;
            } else{
                break;
            }
        }
        if(f==ls)
            break;
    }
    if(f==ls){
        puts(ch);
    }
}

個人小結:

本代碼得分100,即通過全部測試數據,如對代碼有疑問,歡迎留言一起探討。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章