題目原文
問題描述(題目鏈結
登陸賬號有問題,要從這個鏈結
登陸,然後點選「模擬考試」,進去找本題目
)
試題編號:
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。請找出能放在給定直方圖裡面積最大的矩形,它的邊要與座標軸平行。對於上面給出的例子,最大矩形如下圖所示的陰影部分,面積...