木棍上隨機放著n只螞蟻,螞蟻朝向隨機,螞蟻相撞後各自往回爬,設木棍長度為k,螞蟻爬行速度為s,請根據所有螞蟻的初始位置求出全部螞蟻爬出木棍所用時間的最長和最短時間??
當我第一眼看到這個題目的時候,我想到的是動態規劃型別的題目吧,
然後嘗試用動態規劃的來求解該問題,想了好久,發現行不通,因為
我始終找不到最優子串行(可能我能力不行吧,感覺動態規劃可以) ,
如果我們將選擇乙個螞蟻將木棍爬行的距離分成兩段,剩下的我就 真的
不會了,然後我重新看了一遍題目,發現最短距離的求法不就是
以木棍中點為分界線,左邊的螞蟻往左走,右邊的螞蟻往右走,這樣
肯定是最
短時間,這樣最短距離的程式就可以寫出來了,最長距離可以
就最短距
離進行模擬,我們可以想象,當兩隻螞蟻相遇的各自往回爬看
成兩隻螞
蟻繼續往前走,其產生的效果是一樣的,只是螞蟻互換了罷了。
這樣我們就可以發現最短距離的求法就是以木棍為分界線,左邊的螞蟻
往右走,右邊的螞蟻往左走,這樣產生的肯定是最長時間。或者在這個
基礎之上,我們可以更加簡單一點,當我們把最短時間求出來之後,可
以用每只螞蟻走完整根木棍所用的總時間減去最短時間則是最大時間,
兩種方法在下面的程式中都有體現。
具體程式如下:
#include"stdio.h"
int route_min(int *s,int l,int v,int n); //s指標記錄了每只螞蟻到左端點的距離,l表示木棍長,v表示螞蟻爬行速度,n表示螞蟻數目
int route_max(int *s,int l,int v,int n);
int min(int x,int y);
int max(int x,int y);
void main()
; int l=20,v=1,n=10;
printf("%d,%d\n",route_min(s,l,v,n),route_max(s,l,v,n)); //按照正常的來求
printf("%d,%d\n",route_min(s,l,v,n),l*n/v-route_min(s,l,v,n)); //用每只螞蟻走完木棍所用的總時間減去最短時間就是最大時間
getchar(); }
int route_min(int *s,int l,int v,int n) //s指標記錄了每只螞蟻到左端點的距離,l表示木棍長,v表示螞蟻爬行速度,n表示螞蟻數目
else }
int max(int x,int y)
else
}
螞蟻問題(演算法)
有一根27厘公尺的細木桿,在第3厘公尺 7厘公尺 11厘公尺 17厘公尺 23厘公尺這五個位置上各有乙隻螞蟻。木桿很細,不能同時通過乙隻螞蟻。開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鐘可以走一厘公尺的距...
3 螞蟻問題
有一根27厘公尺的細木桿,在第3厘公尺 7厘公尺 11厘公尺 17厘公尺 23厘公尺這五個位置上各有乙隻螞蟻。木桿很細,不能同時通過乙隻螞蟻。開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鐘可以走一厘公尺的距...
螞蟻爬行問題
問題描述 n只螞蟻以每秒1cm的速度在長為lcm的竹竿上爬行。當螞蟻看到竿子的端點時就會落下來。由於竿子太細,兩隻螞蟻相遇時,它們不能交錯通過,只能各自反方向爬行。對於每只螞蟻,我們只知道它離竿子最左端的距離為xi,但不知道它當前的朝向。請計算所有螞蟻落下竿子的最短時間和最長時間。對於最短時間,我們...