題目:
在乙個大晴天,oliver與同學們一共n人出遊,他們走到一條河的東岸邊,想要過河到西岸。而東岸有一條小船。
船太小了,一次只能乘坐兩人。每個人都有乙個渡河時間t,船划到對岸的時間等於船上渡河時間較長的人所用時間。
現在已知n個人的渡河時間t,oliver想要你告訴他,他們最少要花費多少時間,才能使所有人都過河。
注意,只有船在東岸(西岸)時東岸(西岸)的人才能坐上船劃到對岸。
分析:這題就十分類似此前的幾個小盆友拿著手電筒過獨木橋的題目。經過不斷的推導,最優方法只能在兩種方法之中誕生,一種是最快的那個人帶乙個最慢的也就是time[i](因為先前快排過所以越後面就是越慢的老頭),最快的那個人再把船送回來;另一種是t[1]和t[2]一起先過去,記錄了t[2]的時間一次,然後t[1]回來,記錄了t[1]的時間,再讓兩個最慢的老頭過去,也就是t[i]和t[i-1],再讓t[2]把船送回來。綜合起來,得到狀態轉移方程:f[i]:=min(f[i-1]+time[1]+time[i],f[i-2]+time[1]+time[i]+time[2]*2);初始化是f[1]=a[1],f[2]=a[2];
附上**:
const
maxn=100000;
vartime,f:array [0..maxn] of longint;
n:longint;
procedure init;
vari:longint;
begin
readln(n);
for i:=1 to n do
readln(time[i]);
end;
procedure qsort(l,r:longint);
vari,j,k,mid:longint;
begin
i:=l;
j:=r;
mid:=time[(l+r) shr 1];
repeat
while time[i]mid do
dec(j);
if i<=j then
begin
k:=time[i];
time[i]:=time[j];
time[j]:=k;
inc(i);
dec(j);
end;
until i>j;
if lqsort(l,j);
if iqsort(i,r);
end;
function min(a,b:longint):longint;
begin
if aexit(a);
exit(b);
end;
procedure main;
vari,j:longint;
begin
qsort(1,n);
f[1]:=time[1];f[2]:=time[2];
for i:=3 to n do
f[i]:=min(f[i-1]+time[1]+time[i],f[i-2]+time[1]+time[i]+time[2]*2);
write(f[n]);
end;
begin
init;
main;
end.
C 農夫過河問題
農夫過河問題 大家有沒有看過我的c學習中的位算,我們用8位二進位制的數字來表示任務的完成與否,1完成 0未完成 現在我們用4個二進位制數來代表 第一位表示農夫 1 北岸,0 南岸 第二位表示狼 1 北岸,0 南岸 第三位表示?1 北岸,0 南岸 第四位表示白菜 1 北岸,0 南岸 我們怎麼判斷農夫在...
c實現農夫過河問題
問題描述 乙個農夫帶著乙隻狼 乙隻羊和一棵白菜,身處河的南岸。他要把這些東西全部運到北岸。問題是他面前只有一條小船,船小到只能容下他和一件物品,另外只有農夫能撐船。另外,因為狼能吃羊,而羊愛吃白菜,所以農夫不能留下羊和白菜或者狼和羊單獨在河的一邊,自己離開。請問農夫該採取什麼方案才能將所有的東西運過...
農夫過河問題C 遞迴實現
乙個農夫帶著 只狼 乙隻羊和 棵白菜,身處河的南岸。他要把這 些東西全部運到北岸。他面前只有一條小船,船隻能容下他和 件物 品,另外只有農夫才能撐船。如果農夫在場,則狼不能吃羊,羊不能 吃白菜,否則狼會吃羊,羊會吃白菜,所以農夫不能留下羊和白菜自 己離開,也不能留下狼和羊自己離開,而狼不吃白菜。請求...