告訴你有乙個長為l(l<=10000)的木桿,上面有n(n<=1000)個螞蟻,他們一開始的朝向隨機,他們會以一定的速度一直向當前方向走,直到兩隻螞蟻相遇,他們會立即掉頭(即往相反方向走),計算t秒後螞蟻的位置
輸入的第一行為陣列個數,
每組陣列第一行為三個正整數,l,t,n,分別表示長度,時間,螞蟻個數。
l 表示向左,r表示向右
輸出格式為n行,輸出每個螞蟻的位置和朝向,如果t秒內已經掉下,輸出fell off。
樣例輸入:
110 1 4
1 r
5 r3 l
10 r
輸出:case:#1
2 turing
6 r
2 turing
fell off
分析:首先要知道乙個原則,螞蟻的相對位置不變,比如一開始,在1 4 8 三個位置有甲乙丙三個螞蟻,無論每個螞蟻的位置如何,朝向如何,在不掉下桿的前提下,無論他們怎麼對頭,他們的相對位置都是不變的,甲一定在乙前面,乙一定在丙前面,只是可能距離發生了改變,位置發生了改變,另外乙個原則是,假設在某時刻兩個螞蟻相對而行,而且執行到某一點,這時候他們會掉頭執行,但是其結果,其實和對穿而過是一樣的,所以我們可以按照這個原則來很快確定其最後狀態,比如一開始為1 r 3l,5r,經過兩秒後,可以判斷其最終態一定是3 r,1 l,7r,省略了複雜的分析過程,直接一步到位,只是,位置是3r的,未必是初始位置是1r的。
基於以上兩個原則,我們寫出如下**
#include #include #include using namespace std;
const int max=10000;
typedef struct a
ants;
ants before[max];
ants after[max];
int record[max];
const char information[10]=,,};
//1 代表右轉 -1代表左轉 0代表正在轉身
bool cmp(ants & a,ants & b)
else if(c_status=='r')
after[i].pos=before[i].pos+before[i].status*t;
i++;
} sort(before,before+n,cmp);
sort(after,after+n,cmp);
for(i=0;i10)
cout<<"fell off"<
螞蟻爬桿問題
問題描述 有一根27厘公尺長的細木桿,在第3厘公尺,7厘公尺,11厘公尺,17厘公尺,23厘公尺這五個位置上各有乙隻螞蟻,木桿很細,不能同時通過兩隻螞蟻,開始時,螞蟻的頭朝向左還是右是任意的,他們只會朝前走或掉頭,但不會後退,當兩隻螞蟻相遇後,螞蟻會同時掉頭朝反方向走,假設螞蟻們每秒鐘可以走1厘公尺...
螞蟻爬桿問題分析
題目 讀完這道題以後,我的想法是 最短時間考慮如下 首先標出木桿的中點,即在 0 27 2 13.5厘公尺處。然後所有的螞蟻都沿著木桿向離自己較近的一端走,這樣所有螞蟻都離開木桿的時間是最短的,即,為距離木桿中點最近的螞蟻走向離它最近一端所用的時間。所以此題為11s。0 13.5 27 最長時間考慮...
java螞蟻爬桿
ant private void setmaxtime maxtime maxnearsideposition.divide speed public bigdecimal getmaxtime private void setmintime bigdecimal anotherhalflength...