CCF題庫——201312-3最大的矩形
阿新 • • 發佈:2021-01-25
試題編號: | 201312-3 |
試題名稱: | 最大的矩形 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: | 問題描述 在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i(1 ≤ i ≤ n)個矩形的高度是hi。這n個矩形構成了一個直方圖。例如,下圖中六個矩形的高度就分別是3, 1, 6, 5, 2, 3。
輸入格式 第一行包含一個整數n,即矩形的數量(1 ≤ n ≤ 1000)。 輸出格式 輸出一行,包含一個整數,即給定直方圖內的最大矩形的面積。 樣例輸入 6 樣例輸出 10 |
本題看似麻煩,實際上是一個可以尋找到規律的模擬題,思路:
矩形的寬和高分別為相應大矩形中小矩形個數以及對應小矩形的最“矮”的高,故可以按照大矩形中小矩形個數劃分大矩形。大矩形寬:1~n,根據觀察可知,寬為n的大矩形只有一個,寬為n-1的大矩形為2個,可得寬為n-i的大矩形有i+1個;進而可得尋大矩形的規律:從寬為n開始按照對應大矩形個數,由位置0到i劃分大矩陣並求出對應面積,在這期間不斷更新最大面積值,最終得出結果。(語言表達能力欠缺,如果不清楚則看程式碼)
#include <iostream> using namespace std; int main(){ int n; int store1[1001]; cin >> n; for(int i = 0; i < n; i++) cin >> store1[i]; int num = (n * (n + 1))/2, mmax = 0; for(int i = n; i > 0; i--){ //i標識矩形中小矩形的數量 for(int j = 0; j <= n - i; j++){ // j標識每個大矩形的起始位置 int k = i, g = store1[j]; for(int t = 0; t < i; t++){ //t標識大矩形中小矩形的位置 if(store1[t + j] < g) g = store1[t + j]; } if(g * k > mmax) mmax = g * k; } } cout << mmax << endl; return 0; }
這道題初看直接想要跳過,但是仔細分析會覺得這道題很簡單。