CCF 最大的矩形

2022-04-30 08:33:08 字數 3482 閱讀 1618

題目原文

問題描述(題目鏈結

登陸賬號有問題,要從這個鏈結

登陸,然後點選「模擬考試」,進去找本題目

試題編號:

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個矩形的高度。

輸出格式

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

樣例輸入

63 1 6 5 2 3

樣例輸出

10題目大意

先輸入n,之後給你n個數字hi(h0,h1,h2...hn-1)。每個數字代表矩形的高,n個底座為1長度,高為給定數值hi高度的矩形,沿著x軸橫向向右無縫銜接。讓你求出此圖形構成的最大矩形面積。

解題思路

兩次遍歷,第一次遍歷n個數值,"i" 作為變數,對於每個數值進行二次遍歷,「j」作為變數,即向左和向右總共有多少比「i」變數對應的「hi」數值大的,遇到第乙個比這個「hi」小的則停止,最後左右兩個方向得到的格仔數相加,作為矩形一條邊(底),再用「i」作為另一條邊(高),相乘得矩形面積

附錄思路1:

讀完題最先想到暴力,但想錯了,想的是先從下(最低高度hi)往上(最高高度hi)遍歷,

再遍歷n。明顯複雜度達到了10^7,正常1s也就是10^7左右(可能會更大數量10^8)

這種方法對於稀疏資料(即存在多個高度為0的小矩陣)還行,稠密的就沒什麼用處了。

具體就是用is_資料記錄都有哪些格仔是哪些高度,同型別高度有幾個。比如樣例,我就應該記錄成

316523

從下往上,即

123356

放入is_  (類似一種資料結構的儲存結構(我忘了。。。回頭補)

1 12 4

3 2  0 5(這裡表示有兩個)

5 36 2

第一列表示給的資料「hi」,資料3後面的2表示高度3有兩個,0和5與其他(第二列)資料一樣,都是在n中的位置(以便最快給出,而不用遍歷)

但感覺實現相當複雜,特別不好寫,大概率寫不出來。

思路2:

想到兩次遍歷n,n^2(10^6),1s綽綽有餘。

實際寫1:

有必要說一下,ccf貌似沒有用 while(scanf("%d", &n) != eof) 判斷的寫法,所以不要求重置賦值。也就是說我的**對於ccf測評機是可以ac的,但是如果這樣輸入

99 9 9 9 9 9 9 9 9813

3 2 1

81發現第二組資料也是81了,ccf測評機類似手動不斷執行乙個乙個測試一樣,所以,為了一次輸入多個樣例最好,在

while(scanf("%d", &n) != eof) 下面加上這兩句

memset(map, 0, sizeof(map));

answer = 0;

實際寫2:memset 需要 cstring

實際寫3:

我用思路1寫的時候(沒寫完最後是錯的),無意間我現本題後台資料「hi」高度並不只是10^4以內

錯誤**不貼出來了,我就把本質發一下吧。

就是說,我把

is_[map[i]] = 1; 放到正確**中會只得90分

是否有此高度

5int

maxhigh;

6int

minhigh;

7int

main()818

for(int i = 0; i < n; i ++)

27 flag =i;

28while(flag < n && map[flag] >=map[i])

33int thiss = (right + left + 1) *map[i];

34if(thiss >answer)

35 answer =thiss;36}

37 printf("

%d\n

", answer);38}

39 }

重點就看加粗這句話,去掉就滿分ac,加上就90,提示執行錯誤(即執行一般程式崩潰了,諸如除以0或者陣列越界)

最後發現是陣列越界,把int a[10050],改成int a[30050]就好了。。。後台測試資料沒有嚴格按照10000這個最高 hi 範圍來。。。。。

這個題看上去挺難的,但是由於資料並不大所以暴力了,學了下別人的**思路,學到幾個方法,其中有線性複雜度的,我這個複雜度是n^2

學習1:

哎,算了,看別人**很頭疼!!!思路都不一樣

另外,查題解的時候,對比發現的部落格編輯器是我見過最難看的

CCF 最大的矩形

題意 不用說了,反正就是怎麼最大怎麼來。這次用的還是較笨的辦法,當然感謝老趙同學的幫助。傳送門開啟 傳送門。我說一下思路,引用dp的思想,在某個狀態下,假設是第三個矩形我們可以選擇自身,也可以選擇後面的矩形形成最大面積。下面貼 include include include include usin...

最大的矩形(ccf)

某年ccf比賽題,ccf測試資料很獨特,並且是根據你做正確的測試資料給分的,想要得滿分,就一定不能放過任何乙個優化的點 題目描述 在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i 1 i n 個矩形的高度是h i。這n個矩形構成了乙個直方圖。例如,下圖中六個矩形的高度就分別是3,1,6,5,2...

最大的矩形(CCF)

問題描述 在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i 1 i n 個矩形的高度是hi。這n個矩形構成了乙個直方圖。例如,下圖中六個矩形的高度就分別是3,1,6,5,2,3。請找出能放在給定直方圖裡面積最大的矩形,它的邊要與座標軸平行。對於上面給出的例子,最大矩形如下圖所示的陰影部分,面積...