題目:
有一群海盜(不多於20人),在船上比拼酒量。過程如下:開啟一瓶酒,所有在場的人平分喝下,有幾個人倒下了。再開啟一瓶酒平分,又有倒下的,再次重複...... 直到開了第4瓶酒,坐著的已經所剩無幾,海盜船長也在其中。當第4瓶酒平分喝下後,大家都倒下了。等船長醒來,發現海盜船擱淺了。他在航海日誌中寫到:「......昨天,我正好喝了一瓶.......奉勸大家,開船不喝酒,喝酒別開船......」
請你根據這些資訊,推斷開始有多少人,每一輪喝下來還剩多少人。
如果有多個可能的答案,請列出所有答案,每個答案佔一行。
格式是:人數,人數,...
例如,有一種可能是:20,5,4,2,0。
分析:根據題目描述,可以分析出題目的需求是要找到4個分數之和等於1,並且這4個分數的分子都是1,需要我們通過程式設計找到分母。
思路:不多於20人,總人數不確定,但不會大於20個人,從20開始往前窮舉,假設第一次(也就是a)是20人,在窮舉bcd,因為船長每輪喝酒都參加了,而他又說他剛好喝了一瓶酒,則他在每次比酒的時候平分給他的酒之和應該是等於1的,由於是浮點數,運算時都要加上.0;
**:#includeusing namespace std;
int main()
{ int a,b,c,d;
for (a=20;a>=1;a--)
for (b=a-1;b>=1;b--)
for (c=b-1;c>=1;c--)
for (d=c-1;d>=1;d--)
{ if (1.0/a+1.0/b+1.0/c+1.0/d==1.0)
{cout<
下面介紹兩種比較方法:
1.兩數絕對值之差比自己規定的乙個很小的數還要小,則等式成立。(這才是比較浮點數是否相等的可靠方法)
#include#include#define min 0.000001 //巨集定義乙個比較小的數
using namespace std;
int main()
{ int a,b,c,d;
for (a=20;a>=1;a--)
for (b=a-1;b>=1;b--)
for (c=b-1;c>=1;c--)
for (d=c-1;d>=1;d--)
{ if (fabs(1.0/a+1.0/b+1.0/c+1.0/d - 1.0) < min)
{cout<
2.將兩式數值全都變成整數在進行比較
#include#includeusing namespace std;
int main()
{ int a,b,c,d;
for (a=20;a>=1;a--)
for (b=a-1;b>=1;b--)
for (c=b-1;c>=1;c--)
for (d=c-1;d>=1;d--)
{ if (b*c*d+a*c*d+a*b*d+a*b*c == a*b*c*d) //轉為整數
{cout<
海盜比酒量 藍橋杯
這是2012年藍橋杯全國軟體大賽預賽的第三題,情景是海盜喝酒,問題是每瓶酒後未倒下的人數。有一群海盜 不多於20人 在船上比拼酒量。過程如下 開啟一瓶酒,所有在場的人平分喝下,有幾個人倒下了。再開啟一瓶酒平分,又有倒下的,再次重複.直到開了第4瓶酒,坐著的已經所剩無幾,海盜船長也在其中。當第4瓶酒平...
藍橋杯備戰 海盜比酒量
題目 有一群海盜 不多於20人 在船上比拼酒量。過程如下 開啟一瓶酒,所有在場的人平分喝下,有幾個人倒下了。再開啟一瓶酒平分,又有倒下的,再次重複.直到開了 第4瓶酒,坐著的已經所剩無幾,海盜船長也在其中。當第4瓶酒平分喝下後,大家都倒下了。請你根據這些資訊,推斷開始有多少人,每一輪喝下來還剩多少人...
2012藍橋杯C 本科 比酒量
有一群海盜 不多於20人 在船上比拼酒量。過程如下 開啟一瓶酒,所有在場的人平分喝下,有幾個人倒下了。再開啟一瓶酒平分,又有倒下的,再次重複.直到開了第4瓶酒,坐著的已經所剩無幾,海盜船長也在其中。當第4瓶酒平分喝下後,大家都倒下了。請你根據這些資訊,推斷開始有多少人,每一輪喝下來還剩多少人。如果有...