头像

Cyan

四川成都

深度强化学习炼丹师

2012年第三届蓝桥杯省赛-C.比酒量

2012年第三届蓝桥杯省赛-C.比酒量

2021-12-02 · 43次阅读 · 原创 · 数据结构与算法

题面

有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复… 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。

等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“…昨天,我正好喝了一瓶…奉劝大家,开船不喝酒,喝酒别开船…”。

请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。

如果有多个可能的答案,请列出所有答案,每个答案占一行。

格式是:人数,人数,…

例如,有一种可能是:20,5,4,2,0

题解

枚举

由题可知,总共喝完四瓶酒,所有人都倒下了,船长喝满了四轮,则设每轮的开始人数为 a, b, c, d, 0,而船长刚好喝了一瓶酒,则有式子:

1a+1b+1c+1d=1\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} = 1

由于除法可能会造成误差,将其变换为乘法:

b×c×d+a×c×d+a×b×d+a×b×c=a×b×c×db\times c\times d + a\times c\times d + a\times b\times d + a\times b\times c = a\times b\times c\times d

则接下来直接遍历a, b, c, d即可,同时需注意, a <= 20(海盗人数不超过20人), 之后每一轮的人数至少比前一轮少一(每一轮都有人倒下)。

答案:

20 5 4 2 0
18 9 3 2 0
15 10 3 2 0
12 6 4 2 0

代码

#include<iostream> using namespace std; int main() { for (int a = 20; a; --a) { for (int b = a - 1; b; --b) { for (int c = b - 1; c; --c) { for (int d = c - 1; d; --d) { int s = b * c * d + a * c * d + a * b * d + a * b * c; int t = a * b * c * d; if (s == t) { cout << a << " " << b << " " << c << " " << d << " " << 0 << endl; } } } } } return 0; }

标题: 2012年第三届蓝桥杯省赛-C.比酒量
链接: https://www.fightingok.cn/detail/154
更新: 2022-09-18 22:43:35
版权: 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可