線性資料結構有很多:一維陣列、指標、棧、佇列、還有stl裡面定義的一些資料結構等等。這些線性結構在解決一些問題方面也是很有用的。一維陣列,大家都很清楚,有固定長度,有下標,每乙個下標的位置對應乙個值;指標,也可以看成一維陣列;棧是乙個先進後出的資料結構;佇列是乙個先進先出的資料結構,等等。
這一專題也沒什麼好寫的,只能說做題,利用這些線性資料結構來完成一些題目。
1.largest rectangle in a histogram(hdu 1506: )
題意:求一組相鄰單位寬度的長方形所能組成的最大長方形的面積。
如圖:左邊長方形集合中能組成最大的長方形面積就是右面陰影部分。
要求求得這個陰影部分的面積。
題解:可以看出,這些矩形的寬度是一樣的,那麼要求組合之後的最大面積,我們可以想象乙個「吞併」的方法。任意乙個位置的長方形都可以「吞併」它周圍比它高的長方形,在比它低的長方形面前停下。然後利用這個長方形的高度乘以「吞併」的長方形總個數,就是這個長方形可以擴充套件的最大面積。這樣這樣我們就可以求出最大長方形面積了。
具體實現的資料結構可以是單調棧。
轉化為另乙個小問題:在乙個一維陣列中求左邊和右邊第乙個小於它的元素的位置。演算法偽**就是:從左到右遍歷一遍陣列,棧頂存放的是遍歷過程中最小的元素的下標。因為,越靠右而且越小的元素 總是 它左邊比它還大的元素 是後面元素先往左找到的比當前元素要小的元素位置。
stack 棧 s,存入的是每個元素的下標。l[i] 陣列用於存放每個小於它的左邊元素。對於陣列 a 。
for :i->n
while(棧不空&&棧頂元素要不小於當前元素)
彈出棧頂元素
if (棧空)
l[i]=0(記錄左邊比之小的元素為0)
else l[i] = 棧頂
當前元素下標入棧。
用於解題的**:
#include#includeusing namespace std;
long long a[100005];
struct cfx
;int main()
stackk;
for(int i=n;i>=1;i--)
for(int i=1;i<=n;i++)
cout中間有兩部分運用單調棧來解決的問題,一次是往左找,另一次是往右找。
最後再來個相減求出長度來就能求出面積來了。
2.jessica『s reading problem(poj3320)
jessica 要讀一本書,這本書有p頁,第i頁恰好有乙個知識點ai(每個知識點都有不一樣的編號)。全書中的知識點可能會被多次提到。考試之前,她要把所有知識點都複習了。
本題利用線性資料結構是 一維陣列,利用的方法是尺取法。
尺取法我的理解:從這個序列中定義一段,這個「段」有開始節點和結束節點。初始化時,開始節點等於末尾節點,通過不斷移動末尾節點,來判斷這一段是否已經是符合要求的一段,如果是,那麼就移動開始節點,直到末尾節點到達序列的末尾,從之前到達過的所有這些「段」的狀態來判斷乙個最符合的結果。
當時ac的**(可能有點多餘):
#include#include#include#include#pragma warning(disable:4996)
using namespace std;
int min(int a, int b)
int main()
int n = 0;
int cnt = se.size();
/*for (int i = 1; i < p; i++)
}}*/
//cout << cnt << endl;
int s = 0, t = 0, num = 0;
map count;
int ans = p;
for (;;)
count[a[t]]++;
t++;
}if (num < cnt) break;
ans = min(ans, t - s);
count[a[s]]--;
if (count[a[s]] == 0)
s++;
} deletea;
cout << ans << endl; }
return 0;
}
對於上面的**,還是有幾點要說明的。首先直接的尺取演算法是按照學長的來的;利用set是因為set定義的資料結構裡面有乙個好用的功能就是可以輸出這個序列中不同元素的個數,即知識點的個數;然後map是為了記錄每個知識點出現的次數。
然後這個**的問題就是:set在插入的時候用了很長的時間。。。
3.sequence(poj3061)(尺取法之二)
長度為n的數列,有a0,a1,a2...an-1 ,和乙個整數s。求這個序列中連續子串行總和不小於s的長度的最小值。如果解不存在那麼就輸出0。例如:
sample input
2sample output10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5
2同樣利用尺取法,首先初始化s=t=sum=0;while(sum=s的話,就終止,並且更新最小值為min(ans,t-s);如果滿足了sum>=s,那麼要更改ans,同時減去as,再來進入下一次的判斷或者增加t。3
具體的**:
#includeusing namespace std;
int a[100005];
int min(int a,int b)
{ return a>t;
while(t--)
{ cin>>n>>s;
for(int i=0;i>a[i];
int s=0,t=0,sum=0;
int ans=n+1;
while(true)
{ while(tn) ans=0;
cout線性結構也就寫這麼多吧。其實在stl裡面有很多很多的好用的線性結構,什麼優先佇列,set,map,pair 等等,都有各自的長處。
C 期末考試複習資料四
一 填空題 1 如果類a繼承了類b,則類a稱為 類,類b稱為 類。2 在繼承機制下,當物件消亡時,編譯系統先執行 的析構函式,然後才執行 的析構函式。3 繼承發生在利用現有類派生新類時,其中 稱為基類,或 類 稱為派生類,或 類。4 在c 語言中,派生類繼承了基類的全部資料成員和除 之外的全部函式成...
《資料結構》實驗課期末考試
是直接從提交的答題卡上覆制的,可能格式啥有錯 執行結果當時要求用自己的姓名就不粘過來了 題目 1 30分 利用自己的姓名拼音字母建立乙個單鏈表 帶頭結點 注意,如果鍊錶存在已知字母,則不能插入。輸入格式樣例 請輸入姓名 liming 建立的單鏈表輸出為 l i m n g 注 1 輸入自己姓名拼音,...
北航c 期末考試複習
筆者總結了北航計算機系c 考試的一些重點,希望對以後複習的同學能有所幫助 迭代器,工程模式,觀察者模式必考 變數基本資料型別 void bool char intfloat double wchar t short int typedef newtype oritype sizeof 三種用法 si...