《花生採摘》解題報告

2021-09-24 20:47:21 字數 3817 閱讀 2396

by sx349

【摘要】

核心演算法思想:貪心

主要資料結構:

其他輔助知識:

時間複雜度:

空間複雜度:

【題目大意】

給定乙個非空矩陣,每次都從中選擇乙個最大值並將其從矩陣中排除,將這些取出的數排序後計算其花費(相鄰兩數的花費是其在矩陣之間的曼哈頓距離),求在給定最大花費下,能取到的最大值的最大總和。

【演算法分析】

文中說道:「你先找出花生最多的植株,去採摘它的花生;然後再找出剩下的植株裡花生最多的,去採摘它的花生;依此類推,不過你一定要在我限定的時間內回到路邊。」

根據這一句話,我們直接就可以得出,這道題應該採用貪心的演算法。

因此,我們先對資料進行從大到小的排序,然後每次都取其中的最大值。因為必須在規定的時間內回到路邊,所以在每次取最大值時,首先判斷在採摘了這一次之後是否有足夠的時間回到路邊,即(去採摘目標花生的時間)+(採摘那目標花生所用的1單位時間)+(從目標所在地往第一行的時間)<=(剩下的單位時間)。若條件不滿足就停止,若滿足就繼續採摘。

由於去摘花生必須從路邊進入花生田和從花生田出來,所以我們可以先減去2個單位時間,再將剩下的時間進行模擬。

【心得體會】

花生採摘是一道典型的貪心問題,也是一道典型的簡單題(因此這道題的演算法分析也只能這樣簡單了……)。但是這道題有乙個區別於其他問題的地方:在解決問題的過程中,主要部分(連續取最大值)的時間複雜度只需要,而排序卻花費了的時間複雜度。

這一點確實是在許多情況下無法迴避的乙個問題。我一直記得我們平時上課的計算機書上有乙個簡單的例子:給你一些**號碼,讓你去尋找某乙個指定的號碼。

書上的解釋是用二分查詢,但是我們來考慮一下,二分查詢合適嗎?當然,如果是在有序的情況下,二分的複雜度是,但是,在無序的情況下,二分必須要在排序好後才能解決,那麼時間複雜度就上公升到了,因為除了少部分特殊的排序之外,因此不可避免地導致了的排序複雜度。如此一來,就超過了順序查詢的複雜度了。

難道排序的合理性就此受到了質疑了嗎?當然不是,如果是查詢多次的話,二分查詢的時間複雜度就是,而順序查詢則飆公升到了。由此我們可以得出這樣乙個結論:

預處理操作的效率隨著預處理所得到的資料的使用率的提高而提高。

這又引出了這樣乙個怪異的想法:如果我找到了針對某個問題的乙個時間複雜度僅為的主演算法,那麼我是不是就一定能解決它呢?顯然不是。

如果這個問題的輸入達到了上千萬乃至上億,單單讀入的複雜度就已經使程式罷工了。同樣的,我也曾經有過因為輸出過多而導致超時的經歷。

因此,輸入、輸出、排序乃至其他一些游離於主演算法之外的東西,有時反而成為了乙個問題的決定點,這種出人意料的場景也著實是值得我們思考的。

【附錄】

【問題描述 】

魯濱遜先生有乙隻寵物猴,名叫多多。這天,他們兩個正沿著鄉間小路散步,突然發現路邊的告示牌上貼著一張小小的紙條:「歡迎免費品嚐我種的花生!——熊字」。

魯濱遜先生和多多都很開心,因為花生正是他們的最愛。在告示牌背後,路邊真的有一塊花生田,花生植株整齊地排列成矩形網路(如圖1)。有經驗的多多一眼就能看出,每株花生植株下的花生有多少。

為了訓練多多的算術,魯濱遜先生說:「你先找出花生最多的植株,去採摘它的花生;然後再找出剩下的植株裡花生最多的,去採摘它的花生;依此類推,不過你一定要在我限定的時間內回到路邊。」

我們假定多多在每個單位時間內,可以做下列四件事情中的一件:

1) 從路邊跳到最靠近路邊(即第一行)的某棵花生植株;

2) 從一棵植株跳到前後左右與之相鄰的另一棵植株;

3) 採摘一棵植株下的花生;

4) 從最靠近路邊(即第一行)的某棵花生植株跳回到路邊。

現在給定一塊花生田的大小和花生的分布,請問在限定的時間內,多多最多可以採到多少個花生?注意可能只有部分的植株下面長有花生,假設這些植株下的花生個數各不相同。

例如在圖二所示的花生田裡,只有位於(2,5),(3,7),(4,2),(5,4)的植株下長有花生,個數分別為13,7,15,9。沿著圖示的路線,多多在21個單位時間內,最多可以採到37個花生。

[輸入檔案]

輸入檔案peanuts.in的第一行包括三個整數,m,n和k,用空格隔開;表示花生田的大小為m*n(1<=m,n<=20),多多採花生的限定時間為k(0<=k<=1000)個單位時間.

接下來的m行,每行包括n個非負整數,也用空格隔開;

第i+1行的第j個整數pij(0<=pij<=500)表示花生田裡植株(i,j)下花生的數目,0表示該植株下沒有花生。

[輸出檔案]

輸出檔案peanuts.out包括一行.

這一行只包含乙個整數,即在限定時間內,多多最多可以採到的花生的個數。

[樣例輸入]

6 7 21

0 0 0 0 0 0 0

0 0 0 0 13 0 0

0 0 0 0 0 0 7

0 15 0 0 0 0 0

0 0 0 9 0 0 0

0 0 0 0 0 0 0

[樣例輸出1]

37[樣例輸入2]

6 7 20

0 0 0 0 0 0 0

0 0 0 0 13 0 0

0 0 0 0 0 0 7

0 15 0 0 0 0 0

0 0 0 9 0 0 0

0 0 0 0 0 0 0

[樣例輸出2]

28【源程式清單】

program peanuts;

var x,y,value:array[0.400] of longint;

map:array[1..20,1..20] of longint;

m,n,k,i,j,top,t,sum:longint;

procedure sort(l,r:longint);

vari,j,mid:longint;

begin

i:=l;j:=r;mid:=value[(l+r) div 2];

repeat

while value[i]>mid do inc(i);

while value[j]if i<=j then begin

value[0]:=value[i];

value[i]:=value[j];

value[j]:=value[0];

x[0]:=x[i];x[i]:=x[j];x[j]:=x[0];

y[0]:=y[i];y[i]:=y[j];y[j]:=y[0];

inc(i);dec(j);

end;

until i>j;

if i if l end;

procedure print(k:longint);

begin

writeln(k);

halt;

end;

begin

read(m,n,k);

top:=0;

for i:=1 to m do

for j:=1 to n do begin

read(map[i,j]);

if map[i,j]<>0 then begin

inc(top);

value[top]:=map[i,j];

x[top]:=i;y[top]:=j;

end;

end;

sort(1,top);

k:=k-2;

x[0]:=1;y[0]:=y[1];

t:=0;i:=1;sum:=0;

while t t:=t+x[i]-x[i-1]+y[i]-y[i-1]+1;

if t+x[i]-1>k then print(sum);

sum:=sum+value[i];

t:=t+x[i]-1;

inc(i);

end;

end.

棉花生產實習報告

一 實驗目的 1.學習棉花主要植物學形態特徵。2.掌握棉花動態生長發育。3.掌握棉花產量形成過程 理論產量及田間實收產量的估測方法和考種方法。2 棉花的主要植物學形態特徵 1.根 棉花根系為直根系,呈倒圓錐形。直播棉花的主根上粗下細,主根入土深度因品種 土壤質地 結構 土層厚薄和水分狀況等環境條件不...

解題報告2 炸彈

藍貓炸彈 解題報告 1 題目描述 這天,藍貓2號來到了乙個實驗室,他正在對一排炸彈進行研究,這些炸彈排在一條直線上。為了方便,藍貓2號就把它們的位置用乙個數來表示,這個數就是這乙個炸彈與最左邊炸彈的距離,每乙個炸彈i都有乙個 威力值 si。如果藍貓2號直接引爆了乙個炸彈i,那麼它的威力就會向直線的兩...

銀鷺花生牛奶廣告效果評估調查問卷報告

小組成員 許慨 1009138 李偉 1009132 陳建奧 1009137 一 調查背景 廈門銀鷺食品 成立於1985年,主要從事罐頭食品以及飲料生產與加工,經過20年的發展,已經成為福建最大飲料生產基地,同時也是中國10大罐頭工業之一,2002年榮獲農業產業化國家重點龍頭企業,銀鷺品牌榮獲中國十...