(過河問題)
在乙個月黑風高的夜晚,有一群人在河的右岸,想通過唯一的一根獨木橋走到河的左岸.在伸手不見五指的黑夜裡,過橋時必須借照燈光來照明,不幸的是,他們只有一盞燈.另外,獨木橋上最多能承受兩個人同時經過,否則將會坍塌.每個人單獨過獨木橋都需要一定的時間,不同的人要的時間可能不同.兩個人一起過獨木橋時,由於只有一盞燈,所以需要的時間是較慢的那個人單獨過橋所花費的時間.現在輸入 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的點表示橋的終點。青蛙從橋的起...