乘坐木筏問題

2021-08-11 05:56:25 字數 4190 閱讀 9014

/**

問題描述:

乙個公司的所有員工正在風景秀麗的海南島旅遊,計畫行程準備從三亞碼頭渡海去

蜈支洲島,但由於最近的颱風「瓊花」摧毀了所有的渡船,遊輪,輪船,帆船等,只

有一種正方形的木筏還在運營中。

這種木筏有n排座位,編號從1到n(n可能是乙個兩位數);每排有n列座位,編號為

(a, b, c, d ..), 這樣每個座位都有唯一的對應號碼,由乙個數字和乙個字母

組成,例如,「9c」 代表第9排第3個座位。但是有一些座位已經預先放上了空桶,

假設空桶沒有分量,但該座位也不能再坐人了。另外還有一些座位已經分配給了

當地的漁民。為了航行安全,木筏渡海時必須保持平衡,所以必須滿足以下條件:

(1) 前一半座位所坐的總人數要等於後一半座位所坐的總人數。

(2) 左一半座位所坐的總人數要等於右一半座位所坐的總人數。

現在,看如何來安排座位,使得木筏一次可以坐更多的公司員工。假設員工的數量

沒有限制,並且每個人無論是員工還是漁民的重量都是相等的。

例如,有4*4的木筏,如下圖所示:

a  b  c  d

1 |.  s  s  s

2 |s  .  .  t

3 |.  t  .  .

4 |.  s  .  .

s是被空桶佔著的座位,t是漁民的座位,.是空餘的座位。

那麼,最多還可以坐六名公司員工,保證前後左右分別都相等。

a  b  c  d

1 |n  s  s  s

2 |s  n  n  t

3 |n  t  n  .

4 |.  s  n  .

n為我們的員工,左總人數=4=右總人數,前總人數=4=後總人數。

這樣,總共最多可以安排6名員工,同時還能保證木筏平衡。

write a function:

class solution

給定木筏的大小n,和兩個字串分別代表桶的位置s和漁民的位置t,返回能

保障平衡的可容納員工的最多人數。如果無論怎樣也不能保障平衡,返回-1.

for instance,

given n=4, s="1b,1c,4b,1d,2a" and t="3b,2d",

your function should return 6.

// you can use includes, for example:

// #include

#include

#include

#include

#include

#include

#include

using namespace std;

// you can write to stdout for debugging purposes, e.g.

// cout << "this is a debug message" << endl;

////    -----------------

//    |       |       |

//    |  1,i  |  2,j  |

//    |       |       |

//    -----------------

//    |       |       |

//    |  3,m  |  4,n  |

//    |       |       |

//    -----------------

int solution(int n, char* s, char* t)

else  /* 當前行號是個一位數 */

// 檢查引數有效性和重複引數

if (x >= n || y >= n)

if (wood_boat[x*n+y] != '.')

// 標記木筏中空桶的位置's'

wood_boat[x*n+y] = 's';

// 判斷當前空桶位於哪個象限,並且分別計數

if      (x < h  && y <  h)   ++s1;

else if (x < h  && y >= h)   ++s2;

else if (x >= h && y <  h)   ++s3;

else  /*(x >= h && y >= h)*/ ++s4;

}// end while

// step-2: 計算每個象限中漁民的數量

i = 0;

while (i < len_t)

else  /* 當前行號是個一位數 */

// 檢查引數有效性和重複引數

if (x >= n || y >= n)

if (wood_boat[x*n+y] != '.')

// 標記木筏中漁民的位置't'

wood_boat[x*n+y] = 't';

// 判斷當前漁民位於哪個象限,並且分別計數

if      (x < h  && y <  h)   ++t1;

else if (x < h  && y >= h)   ++t2;

else if (x >= h && y <  h)   ++t3;

else  /*(x >= h && y >= h)*/ ++t4;

}// end while

// step-3: 算出四個象限空位的數量

e1 = q - s1 - t1;

e2 = q - s2 - t2;

e3 = q - s3 - t3;

e4 = q - s4 - t4;

// step-4: 列印木筏的布局

std::cout << "\n  ┌----┬----┐";

std::cout << "\n  │ q1 │ q2 │";

std::cout << "\n  ├----┼----┤";

std::cout << "\n  │ q3 │ q4 │";

std::cout << "\n  └----┴----┘\n";

std::cout << "\nin this case, \n";

std::cout << "1th quadrant(q1): [s:" << s1 << ", t:" << t1 << ", e:" << e1 << "]\n";

std::cout << "2th quadrant(q2): [s:" << s2 << ", t:" << t2 << ", e:" << e2 << "]\n";

std::cout << "3rd quadrant(q3): [s:" << s3 << ", t:" << t3 << ", e:" << e3 << "]\n";

std::cout << "4th quadrant(q4): [s:" << s4 << ", t:" << t4 << ", e:" << e4 << "]\n";

// 列印木筏矩陣影象

printf("\n    ");

for (i = 0; i < n; ++i)

printf("%c ", 'a'+i);

printf("\n");

for (i = 0; i < n; ++i)

printf("]\n");

}printf("\n");

delete wood_boat;

// step-5: 判斷平衡性並計算最大可坐員工的數量

// note: 任何乙個象限都有可能不坐乙個員工就已經平衡了,但未必就沒有解;

//       或者它的所有空位都坐滿員工了才能平衡。所以應從0到ei全部遍歷。

//       在任何乙個象限裡,如果坐不滿就能滿足平衡要求了,那麼人的具體

//       位置並不重要。所以,我們只需要知道每個象限最多能坐多少員工並且

//       還能夠保持平衡即可。

int result = 0;

for (i = 0; i <= e1; ++i)

for (j = 0; j <= e2; ++j)

for (m = 0; m <= e3; ++m)

for (n = 0; n <= e4; ++n)

else

}// end if

}// end for

// step-6: 是否有解?

if (result == 0)

return -1;

else

return result;}

乘坐電梯的問題

題目內容 說明 1 假設最開始電梯在0層,n個人從第0層進電梯,中間不再增添新乘客 2 n個人都到達各自的樓層後,電梯需要回到0層 3 到同一樓層的人不管有幾人,電梯開門的時間總共只需要5秒.輸入格式 輸入資料首先包含乙個整數n 0 n 10 表示電梯內的人數 然後是n個人要到的樓層si 1 si ...

乘坐電梯注意事項

而針對眾多的疑問,記者也聯絡到了當事人周先生,他向記者講述了整件事情發生的經過。9月24號中午1點多,周先生把岳父從老家接到了岑鞏縣城。那天我接爸爸下來過中秋節,一起吃飯,然後爸爸就說要去哪個親戚家看親戚,讓我一起去看一下,正好那裡也是我上班的地方。周先生說。周先生是這個小區物業公司的電工,平時也做...

ybt金牌導航1 1 2 乘坐電梯

有乙個電梯,有 n 個人要進電梯。對於每一秒,排在最前面的人有 p 的機率會進電梯 不會再出來 否則不進,別的人都不進。問你 t 秒後,在電梯上的人的期望數量。這道題我們先設 fi,jf fi,j 為在第 i ii 秒之後有 j jj 個人在電梯上的概率。那首先初始化很顯然,f0,0 1f 1 f0...