日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

两人过桥

發布時間:2025/3/15 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两人过桥 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

兩人過橋(bridge.???)

問題描述:
有 n 個人希望在晚上通過一座橋。在任何時刻,最多只能有兩個人在橋上,并且必須
要帶著手電筒才能通過橋。現在的麻煩是只有一個手電筒,所以必須安排某種順序,使得手
電筒可以被帶回去讓更多的人過橋(手電筒必須由人帶回,不可以從對岸扔過去)。
每個人都有不同的過橋時間,兩個人一起過橋所用的時間等于其中較慢的一個。你的
任務是要找出能在最短時間內使所有人都過橋的方案。
輸入格式:
第一行是一個整數 n。
接下來有 n 行,每一行給出一個人的過橋時間(整數,單位:秒)。
每個人的過橋時間不超過 100 秒。
輸出格式:
輸出一行一個數,表示所有人過橋的最短時間。
樣例輸入:
4
1
2
5
10

樣例輸出:
17
樣例解釋:
可以先讓 1 和 2 過橋,然后 1 回來,讓 5 和 10 過橋,然后 2 再回來帶 1 一起過橋,時
間為:2+1+10+2+2=17。
數據限制:
40%的數據滿足:n<=100;
100%的數據滿足:n<=1000。

分析
貪心法

最簡單的一個貪心策略是:讓一個最快的人來回帶人
但是顯然是錯誤的比如4個人:1 1 100000 100000
最快的來回帶的話要:1+1+100000+1+100000=200003
但是如果先將1 1運過去的話,然后1回來,再讓100000 100000一起過去
再讓右邊的1來回一趟,就只要1+1+100000+1+1=100004,這樣顯然小了

所以第一種貪心的策略顯然是不合理的,下面換種貪心策略:
首先,慢的肯定是過了橋之后不回來了
就上面那種情況,我們就是先將最快的兩個帶過去,
然后快的一個過來,讓兩個慢的過去,然后讓快的再回來,……
但是這種貪心策略也不優,因為:
如果是1 10000 10000 10000,答案又不對了(還是第一種策略優)

結合以上兩點,對于最慢的兩個人我們有兩種處理方法就是:
1、讓最快的人來回帶
2、讓最快的兩個人過去,再讓最慢的兩個一起過去,這樣就減少了最慢的重復計算

關于這個貪心策略的證明是:
首先,過橋速度排在第三名之后的人不可能擔任送回手電筒的任務,原因是不如速度第一和第二的人送回來得高效。這樣,
當前左岸速度最慢的人過橋后就不可能再回來,那么我們可以優先讓速度慢的過河,因為其不可能返回,先過后過等效。如此一來,就可以得到上述的貪心策略。

程序:

var a:array[0..12000] of longint; n,i:longint; ans,x,y:int64;procedure kp(l,r:longint); var i,j,mid:longint; beginif l>=r then exit;i:=l;j:=r;mid:=a[(i+j) div 2];repeatwhile a[i]<mid do inc(i);while a[j]>mid do dec(j);if i<=j thenbegina[0]:=a[i];a[i]:=a[j];a[j]:=a[0];inc(i);dec(j);end;until i>j;kp(l,j);kp(i,r); end;beginassign(input,'bridge.in');assign(output,'bridge.out');reset(input);rewrite(output);readln(n);for i:=1 to n doread(a[i]);kp(1,n);ans:=0;i:=n;while true dobeginif i=2 then ans:=ans+a[2];if i=3 then ans:=ans+a[1]+a[2]+a[3];if i<=3 then break;x:=2*a[2]+a[1]+a[i];y:=2*a[1]+a[i]+a[i-1];if x<y then ans:=ans+x else ans:=ans+y;i:=i-2;end;write(ans);close(input);close(output); end.

轉載于:https://www.cnblogs.com/YYC-0304/p/9500070.html

總結

以上是生活随笔為你收集整理的两人过桥的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。