CCF-CSP 最大的矩形

問題描述
在橫軸上放了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、由剛才得到的數組元素的下標,計算這段距離中有多少個矩形,
4、當前元素 * 距離 = temp
5、比較最終答案和temp,如果temp大于最終答案ans,那么ans = temp,否則繼續
但是提交之后發現會超時,每次反復的運算大大增加了時間復雜度,所以筆者從別人那里借鑒到一種方法:
這種方法的大體思路是這樣的,輸入數據之后,遍歷每個數據,對于其中的每一個數據a[i], 從下表i到n-1之間,找到最小的數a[j],用它乘以i到j之間矩形的個數,如果得到的答案大于最終要輸出的答案,那么就把這個答案賦值給最終答案。
說的比較籠統,一會再深入講解,先看看代碼:
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<vector>
 4 #include<string>
 5 #include<cstring>
 6 using namespace std;
 7 const int N = 1003;
 8 int a[N];
 9 
10 int main(){
11     int n;
12     while(cin>>n){
13         for(int i =0  ;i < n;++i){          //輸入數據
14             cin>>a[i];
15         }
16         int ans = -1;                  //先設置最終答案ans為-1
17         for(int i = 0 ; i< n;++i){          //對于每個元素a[i]
18             int low = a[i];              //當前最小值low設置為a[i]
19             for(int j =  i ; j < n;++j){       //對于i后面的每個元素
20                 if(low > a[j])            //如果a[j] 比 當前設置的最小值還要小,那么最小值設置為a[j]
21                     low = a[j];
22                 int temp = (j - i + 1) * low;      //設置標記變量temp 為這段區間中的總和
23                 if(temp > ans)              
24                     ans = temp;
25             }
26         }
27         cout<<ans<<endl;
28     }
29 return 0;
30 }

我想還有許多人對二層循環那里不明白,其實筆者剛開始也不太明白,下面就來講解一下這里吧、、、

有一個問題,就是總是向右邊遍歷,那么左邊的數據怎么算?

其實,在不斷向右邊遍歷的過程中,我們如果把下標 i? 看成后面每個數的左邊界就好了、、、

假如 i 現在為0,那么右邊的每個數的左邊界都是 0,并且按照代碼中寫的,不斷找到i 到j之間的最小值,那么 0 到 i 之間的最小值的最終結果是不是就是n * 最小值呢

如果還不明白,還可以這么想,假如就三個數據,a1,a2,a3, 假如a1 比a2 小的前提下,

(1)a3 大于 a2 并且大于 a1 那么對于a3來說,最大值就是a3

(2)a3小于a2 并且大于a1 ,那么對于a3來說,最大值就是a3 * 2

、、、、、

所以從前向后遍歷的過程,其實就是不斷對于下標為i后面的某個元素j的左方向遍歷過程、、、

大家懂了嗎,如果還有問題,希望大家能提出來,筆者深知能力有限,但是能幫助大家的還是會盡力的、、

轉載于:https://www.cnblogs.com/dqsBK/p/5312578.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396513.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Stack Overflow 2016年對50,000名開發人員進行的調查得出的見解

Today, Stack Overflow released the results of their 2016 survey of more than 50,000 developers.今天&#xff0c;Stack Overflow發布了他們2016年對50,000多名開發人員進行的調查的結果。 I’ve combed through this big document to bring you the most surprising ins…

web管理

1.站點根目錄下查找是否被放置webshell***根據語句判斷是不是PHP***腳本# find /storage/www/ -name "*.php" | xargs grep-in --color "eval("# grep -i --include*.php -r system\s*\( /storage/www/2.統計訪問日志中來自同ip出現的次數分析盜鏈、***、機…

MySQL的主從復制云棲社區_MySQL-主從復制

前言前篇說了作為運維在數據庫塊最起碼要會兩大技能&#xff0c;今天來說說第二技能--主從復制隨著業務的增長&#xff0c;一臺數據庫服務器以滿足不了需求了&#xff0c;負載過重&#xff0c;這時候就需要減壓&#xff0c;實現負載均衡讀寫分離&#xff0c;一主一從或一主多從…

數據存儲(SharedPreferences存儲)

SharedPreferences是通過 鍵值對 的方式存儲數據SharedPreferences是通過鍵值對的方式存儲的 將數據存儲到SharedPreferences中有3種方法&#xff1a;1.Context類中的getSharedPreferences()方法2.Activity類中的getPreferences()方法3.PreferencesManager類中的getDefaultShar…

編程程序的名稱要記住嗎_學習編程時要記住的5件事

編程程序的名稱要記住嗎by Kurt由庫爾特 學習編程時要記住的5件事 (5 Things to Remember When You’re Learning to Program) Learning to program is challenging. Aside from choosing a language or setting up a development environment that you know nothing about, t…

mysql 數據分析的步驟_數據分析8個主要步驟

# 在對數據進行分析時&#xff0c;主要細分為明確目標、應用思維和如下8個具體步驟&#xff1a;1、讀取數據2、清洗數據3、操作數據4、轉換數據5、整理數據6、分析數據7、展現數據8、總結報告接下來將介紹使用python來具體處理數據&#xff0c;包括上面幾個步驟的實現&#xff…

python學習的一個定位_python學習之——selenium元素定位

web自動化測試按步驟拆分&#xff0c;可以分為四步操作&#xff1a;定位元素&#xff0c;操作元素&#xff0c;獲取返回結果&#xff0c;斷言(返回結果與期望結果是否一致)&#xff0c;最后自動出測試報告。其中定位元素尤為關鍵&#xff0c;此篇是使用webdriver通過頁面各個元…

Invoker

Invoker 是實體&#xff0c;dubbo外其他對象的轉化。轉載于:https://www.cnblogs.com/gtaxmjld/p/9786894.html

如何在開源社區貢獻代碼_如何在15分鐘內從瀏覽器獲得您的第一個開源貢獻

如何在開源社區貢獻代碼Matt Mullenweg, founder of Automattic, recently offered this advice to aspiring developers: “Contribute to open source.”Automattic的創始人Matt Mullenweg最近向有抱負的開發人員提供了以下建議 &#xff1a;“ 致力于開源。 ” Mullenweg —…

小心情。

從一開始學習html到現在的nodejs&#xff0c;也有段時間了&#xff0c;那個時候什么都不知道&#xff0c;記得一兩年之前還沉迷在一些網絡技術的圈子里面&#xff0c;每天看著那些大牛&#xff0c;感覺都很是厲害&#xff0c;每一項技術總是那樣的讓我著迷&#xff0c;從易語言…

一、win7下安裝yii2

作者&#xff1a;PHP學習網 出處&#xff1a;http://www.viphper.com/?p1159 本文版權歸作者&#xff0c;歡迎轉載&#xff0c;但未經作者同意必須保留此段聲明&#xff0c;且在文章頁面明顯位置給出原文連接&#xff0c;否則保留追究法律責任的權利。 之前在liunx上安裝過yii…

js獲取瀏覽器滾動條距離頂端的距離

js獲取瀏覽器滾動條距離頂端的距離 一、jQuery獲取的相關方法 jquery 獲取滾動條高度獲取瀏覽器顯示區域的高度 &#xff1a;$(window).height(); 獲取瀏覽器顯示區域的寬度 &#xff1a;$(window).width(); 獲取頁面的文檔高度 &#xff1a;$(document).height(); 獲取頁面的文…

vs dll必須和exe在同一個目錄_Win10系統丟失 .dll 文件的三種解決方案教程

有時候開機或打開一個軟件時&#xff0c;系統會提示無法啟動程序&#xff0c;這是怎么回事呢&#xff1f;這是因為計算機丟失某個或某些dll文件&#xff0c;由于系統本身不存在這些運行庫文件&#xff0c;需要進行添加才能使用該軟件。方法一&#xff1a;下載丟失的.dll文件&am…

datagrid頁面獲取表單一條數據的例子

【問題背景】 最近在做ITOO考評的時候想從頁面獲取表單選中的數據&#xff1a; 【代碼】 在數據網格&#xff08;datagrid&#xff09;組件包含兩種方法來檢索選中行數據&#xff1a; getSelected&#xff1a;取得第一個選中行數據&#xff0c;如果沒有選中行&#xff0c;則返回…

utf-8轉換gbk代碼_將代碼轉換為現金-如何以Web開發人員的身份賺錢并講述故事。...

utf-8轉換gbk代碼by Kurt由庫爾特 將代碼轉換為現金-如何以Web開發人員的身份賺錢并講述故事。 (Turning code to cash — How to make money as a Web Developer and live to tell the tale.) So you just learnt to code. You’re eager and anyone who can’t code thinks …

Spring+SpringMVC+MyBatis+easyUI整合基礎篇(十)SVN搭建

前言 前面一篇文章講了一下版本控制&#xff0c;但其實這一篇并沒有打算講細節的&#xff0c;感覺應該自己去動手弄一下&#xff0c;后來考慮了一下&#xff0c;版本控制真的挺重要的&#xff0c;如果自己實在搭建不好反而不去使用的話&#xff0c;真的有點可惜&#xff0c;當然…

AHK-UMSS框架 (AHK通用修飾鍵解決方案,任何鍵都是修飾鍵)

AHK-UMSS框架 (AHK通用修飾鍵解決方案,任何鍵都是修飾鍵) 1 #Warn2 #NoEnv ; # 禁用環境變量檢查:不檢查空變量是否為"環境變量"&#xff0c;可以極大地提高效率3 #Hotstring EndChars ◎ ; # 熱字串終止符號設置:只把空格作為終止符,(文檔上所說是不能單獨用空格的…

flask-sqlalchemy mysql_Flask SQLAlchemy連接到MySQL數據庫

設置代碼&#xff1a;我正在構建一個帶有AngularJS前端的基本Flask應用程序&#xff0c;目前我需要連接到我用Godaddy phpmyadmin托管的MySQL數據庫。這是我的一部分__init__.pyfrom flask import Flaskfrom flask.ext.sqlalchemy import SQLAlchemy# Create instnace called a…

有沒有編碼的知識圖譜_沒有人告訴您關于學習編碼的知識-以及為什么如此困難...

有沒有編碼的知識圖譜by Joyce Akiko通過喬伊斯明子 沒有人告訴您關于學習編碼的知識-以及為什么如此困難 (What Nobody Tells You About Learning To Code — And Why That Makes It So Hard) Are you familiar with the article Why Learning to Code is So Damn Hard?您是…

Node.js之HTPP URL

幾乎每門編程語言都會包括網絡這塊,Node.js也不例外。今天主要是熟悉下Node.js中HTTP服務。其實HTTP模塊是相當低層次的&#xff0c;它不提供路由、cookie、緩存等,像Web開發中不會直接使用,但還是要熟悉下&#xff0c;這樣也方便以后的學習。 一、統一資源標識符URL 這個是非常…