有n個人希望在晚上通過一座橋。在任何時刻,最多只能有兩個人在橋上,並且必須要帶著手電筒才能通過橋。現在的麻煩是只有乙個手電筒,所以必須安排某種順序,使得手電筒可以被帶回去讓更多的人過橋(手電筒必須由人帶回,不可以從對岸扔過去)。 每個人都有不同的過橋時間,兩個人一起過橋所用的時間等於其中較慢的乙個。你的任務是要找出能在最短時間內使所有人都過橋的方案。
40%的資料滿足:n<=100;
100%的資料滿足:n<=1000
樣例讀入 樣例輸出
4 17
1 2
5 10
可以先讓1和2過橋,然後1回來,讓5和10過橋,然後2再回來帶1一起過橋,時間為:2+1+10+2+2=17。
貪心,先排序
有兩種策略,每次取效率最高的:
1.讓最快的人來回帶
2.先讓最快和次快的人過去,然後最快回來,最慢和次慢過去,次快單獨回來,帶最快過去
從小到大做和從大到小做都可以,從小到大要保持手電筒、最快和次快在右邊,從大到小則保持手電筒、最快和次快在左邊
時間複雜度o(n)
| |
左邊 | | 右邊
(起點) | | (終點)
| |
從大到小
var
n,i,ans:longint;
a:array[1..1000]of longint;
procedure
qsort
(l,r:longint);
var i,j,key,t:longint;
begin
if l>=r then
exit;
i:=l;j:=r;
key:=a[(l+r) div
2]; repeat
while a[i]do inc(i);
while a[j]>key do dec(j);
if i<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
inc(i);dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;
function
min(a,b:longint):longint;
begin
if athen
exit(a) else
exit(b);
end;
begin
readln(n);
for i:=1
to n do
readln(a[i]);
qsort(1,n);
while n>3
dobegin
ans:=ans+min(a[1]*2+a[n]+a[n-1],a[n]+a[2]*2+a[1]);
n:=n-2;
end;
if n=3
then ans:=ans+a[1]+a[2]+a[3]
else ans:=ans+a[n];
writeln(ans);
end.
從小到大
var
n,i:longint;
a,f:array[1..1000]of longint;
procedure
qsort
(l,r:longint);
var i,j,key,t:longint;
begin
if l>=r then
exit;
i:=l;j:=r;
key:=a[(l+r) div
2]; repeat
while a[i]do inc(i);
while a[j]>key do dec(j);
if i<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
inc(i);dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;
function
min(a,b:longint):longint;
begin
if athen
exit(a) else
exit(b);
end;
begin
readln(n);
for i:=1
to n do
readln(a[i]);
qsort(1,n);
f[1]:=a[1];f[2]:=a[2];
for i:=3
to n do
f[i]:=min(f[i-1]+a[i]+a[1],f[i-2]+a[i]+a[1]+a[2]*2);
writeln(f[n]);
end.
益智 兩人過橋問題
有a b c d四個人,要在夜裡過一座橋。他們通過這座橋分別需要耗時1 2 5 10分鐘,只有一支手電,並且同時最多只能兩個人一起過橋。請問,如何安排,能夠在17分鐘內這四個人都過橋?題目解析 四個人a 1分鐘 b 2分鐘 c 5分鐘 d 10分鐘 本題最大的坑點是利用人的常理化思維 一般會讓花費時...
兩人結對作業
1.題目簡介 設計一款掃雷遊戲,要求要有基本的踩雷死亡 周圍雷的數目提示 周圍無雷區自動掃除等功能。2.結對分工及設計 結對分工 劉旭負責介面的開發,王建斌負責遊戲邏輯的開發。設計 本遊戲精妙之處在於自動掃除無雷區的功能,用的是廣度優先的演算法。3.位址 4.測試情況 1.測試遊戲介面是否正常。測試...
兩人合作經過此
專案 貪心演算法的應用 馬踏棋盤 define n 8 voiddfs intx,inty,intcount for i 0 i 8 i 現代軟體產業經過幾十年的發展,乙個軟體由乙個人單槍匹馬完成已經很少見了,軟體都是在相互合作中完成的。合作的最小單位是兩個人,兩個工程師在一起,做得最多的事就是看 ...