题目描述:
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0答案写在“解答.txt”中,不要写在这里!
问题分析:
有几个重要条件:
1.每次喝都有人倒下
2.喝最后一瓶之前不只船长一个人没倒下(即最后一次所剩人数>=2)
3.船长一共喝了一瓶(重点在于船长说的那句话:“我正好喝了一瓶”,由这个条件我们就可以单独考虑船长,船长每次喝人均喝的量最后加起来就是1。)
模拟这四次喝酒:
开始一共n个人
第一次:
每人喝了1/n份酒,倒下a个人,剩下n-a个人
第二次
每人喝了1/(n-a)份酒,倒下b个人,剩下n-a-b个人
第三次
每人喝了1/(n-a-b)份酒,倒下c个人,剩下n-a-b-c个人
第四次
每人喝了1/(n-a-b-c)份酒,剩下0个人
要求的就是n-a、n-a-b、n-a-b-c这三个数;
首先,因为最后一次不只是船长一个人倒下,就是说喝第四瓶酒之前至少有2个人,假设每喝一次倒下一个,那最少也需要5个人。
最多不超多20(题目给的条件),那么n的取值范围是(4<n<21).
船长一共喝了一瓶,那么1/n+1/(n-a)+1/(n-a-b)+1/(n-a-b-c)=1,而a,b,c,n-a-b-c的值在能剩下的所有可能范围内暴力搜索。
代码:
#include<iostream> using namespace std; int main() { float n; float a,b,c; float s1,s2,s3; for(n=5;n<=20;n++)//海盗总人数 { for(a=1;a<=n;a++)//第一轮醉倒的人数 for(b=1;b<=n;b++)//第二轮醉倒的人数 for(c=1;c<=n;c++)//第三轮醉倒的人数 { s1=n-a; s2=n-a-b; s3=n-a-b-c; if(1/n+1/s1+1/s2+1/s3==1&&s1>0&&s2>0&&s3>0) cout<<n<<" "<<s1<<" "<<s2<<" "<<s3<<" "<<"0"<<endl; } } return 0; }
蓝桥杯预赛真题 比酒量(穷举)
最新推荐文章于 2022-03-23 09:48:18 发布