NOIP 過河問題 月黑風高的夜晚

2021-07-11 03:12:30 字數 1658 閱讀 7294

(過河問題)

在乙個月黑風高的夜晚,有一群人在河的右岸,想通過唯一的一根獨木橋走到河的左岸.在伸手不見五指的黑夜裡,過橋時必須借照燈光來照明,不幸的是,他們只有一盞燈.另外,獨木橋上最多能承受兩個人同時經過,否則將會坍塌.每個人單獨過獨木橋都需要一定的時間,不同的人要的時間可能不同.兩個人一起過獨木橋時,由於只有一盞燈,所以需要的時間是較慢的那個人單獨過橋所花費的時間.現在輸入 n(2<=n<1000)和這 n 個人單獨過橋需要的時間,請計算總共最少需要多少時間,他們才能全部到達河左岸.

例如,有 3 個人甲 乙 丙,他們單獨過橋的時間分別為 1 2 4,則總共最少需要的時間

為 7.具體方法是:甲 乙一起過橋到河的左岸,甲單獨回到河的右岸將燈帶回,然後甲,丙在

一起過橋到河的左岸,總時間為 2+1+4=7.

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define size 100

#define infinity 1000000

#define left 1

#define right 0

#define left_to_right 1

#define right_to_left 0

int n,time[size],pos[size];

int max(int a,int b)

int min(int a,int b)

int go(int stage)

if(num<=2) return ans;

ans = infinity;

for(i = 1;i <= n-1; i ++)

if(pos[i] == right)

for(j = i+1;j <= n;j++)

if(pos[j] == right) //ifposj

return ans;

} //ifrtol

if(stage == left_to_right)

return ans;

}//ifltor

return 0;

}int gogo(int n);

if(n==2);

if(n==3) ;

if (n>=4) ans=min(2*time[1]+time[n-1]+time[n],time[1]+2*time[2]+time[n])+gogo(n-2);

return ans;

}int main()

printf("go ans:%d\n",go(right_to_left));

sort(time+1,time+1+n);

printf("gogo ans:%d\n",gogo(n));

return 0;}/*

31 2 4

ans:7

41 2 4 7

ans:14

41 2 10 11

ans:18

4860 396 45 891

ans:2124

*/

用了兩種方法,t2的時間在gogo去掉一次,留給遞迴函式

NOIP提高組2005 過河

過河 river 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的...

馬攔過河卒 NOIP

馬攔過河卒 noip time limit 7000ms memory limit 65536k description 如圖,a點有乙個過河卒,需要走到目標 b點。卒行走規則 可以向下 或者向右。同時在棋盤上的任一點有乙個對方的馬 如上圖的c點 該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點...

NOIP2005 過河題解

在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從橋的起...