題1:搭建雙塔(vijos1037)
2023年9月11日,一場突發的災難將紐約世界**中心大廈夷為平地,mr. f曾親眼目睹了這次災難。為了紀念「9?11」事件,mr. f決定自己用水晶來搭建一座雙塔。
mr. f有n塊水晶,每塊水晶有乙個高度,他想用這n塊水晶搭建兩座有同樣高度的塔,使他們成為一座雙塔,mr. f可以從這n塊水晶中任取m(1≤m≤n)塊來搭建。但是他不知道能否使兩座塔有同樣的高度,也不知道如果能搭建成一座雙塔,這座雙塔的最大高度是多少。所以他來請你幫忙。
給定水晶的數量n(1≤n≤100)和每塊水晶的高度hi(n塊水晶高度的總和不超過2000),你的任務是判斷mr. f能否用這些水晶搭建成一座雙塔(兩座塔有同樣的高度),如果能,則輸出所能搭建的雙塔的最大高度,否則輸出「impossible」。
題2:process the tasks(zoj 3331,10年浙江省賽題)
兩個機器a,b。有n個任務,每個任務可以由a或b完成。排程規則如下:
1.每乙個任務必須由某台機器完成
2.一台機器在某乙個時刻只能處理一件任務
3.只有當1...i-1件任務都已經開始處理之後(包括處理完),第i件任務才能被處理
4.某件任務在處理的過程中不能被打斷
輸入為每件任務在兩台機器上各自的處理時間,程式設計求出處理完所有任務的最短時間。
第一題用dp[i][j]表示放完第i塊水晶後,兩塔高度差為j時,高塔的最大高度。
共有3種轉移:
1.第i塊放在原來的高塔上
2.第i塊放在原來的矮塔上,h=j
可想而知,要想當前問題最優,則轉移之前的狀態一定要最優,滿足動態規劃性質
最後dp[n][0]就是答案
第二題dp[i][j][x]表示當前處理完第i件任務後,兩台機器的結束時間差為j時,最早的總結束時間。x表示j的正負.
同樣,這題也有3種轉移:
1:第n項工作加在較高的塔上,此時雖然高度差增加,但由於n+1項工作必須在第n項開始之後才能開始,因此在另一塔的高度也增加了空閒值。
exp:a:20
b:10
將第n項發任務放在a上後,a->30,而b中10-20那段時間變為不可用,因為題目條件3。因此b的高度變到20。也正因為如此,時間差
最多隻到單件任務時間的最大值。
2:第n項工作加在較低的塔上,使高度差減小,但原先的高塔仍然較高
3:第n項工作加在較低的塔上,使低塔高度超過高塔
最後dp[n][0-max][0|1]中的最小值即為答案。
這兩題的核心思想總體來說是一致的,通過差值來建立狀態,並進行狀態轉移。第二題比第一題更加複雜一點,無論是狀態轉移還是邊界處理。在程式設計的時候,兩道題都更適合用順推的方法來寫,在狀態i的時候優化所有可能達到的狀態j.
一 類與物件
物件的儲存細節 程式啟動,先把程式載入到 區。系統自動建立乙個類物件,載入類中的物件方法列表。當通過乙個類建立物件時,先在堆中開闢一塊儲存空間給物件p,再初始化物件的各屬性為0,最後返回乙個位址儲存到棧中 區域性變數接收 物件的第0個屬性是系統建立的isa指標,指向建立該物件的類。類方法只能類呼叫,...
C 學習(一) 類與物件
大二時學校開過物件導向程式設計 c 語言 的課,使用的是清華大學出版社,李愛華 程磊主編的教材。近兩年在學習和專案中一直使用c,對於c 已經忘記得差不多了。如今大四畢業之際開始學習qt開發上位機,需要用到c 使用原教材再次學習一次。類與物件是c 中兩個基本的概念。可以理解類是資料型別,物件是類定義的...
搭建乙個多任務排程環境
目標實現乙個多工環境。1.系統可以多工執行 2.任務可以模組化程式設計 3.沒有排程演算法,排程點由使用者決定。作業系統描述的是多工處理。多工的意思是在巨集觀上多個任務是同時在執行的,但是微觀上,任何乙個時刻只有乙個任務在執行。作業系統有乙個任務控制塊的結構體,裡面有乙個最重要的成員 棧指標,記錄任...