2012年蓝桥杯省赛A组c++第3题(喝断片的海盗)

/* 
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒, 
所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的, 
再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。 
当第4瓶酒平分喝下后,大家都倒下了。    等船长醒来,发现海盗船搁浅了。 
他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......” 
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。 
如果有多个可能的答案,请列出所有答案,每个答案占一行。 
格式是:人数,人数,... 
例如,有一种可能是:20,5,4,2,0 
*/
 
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<iostream>  
#include<string>  
#include<vector>  
#include<stack>  
#include<bitset>  
#include<cstdlib>  
#include<cmath>  
#include<set>  
#include<list>  
#include<deque>  
#include<map>  
#include<queue>  
using namespace std;

const double eps=pow(10,-6);

int main()
{
    for(int a=20;a>0;a--)
        for(int b=a-1;b>0;b--)
            for(int c=b-1;c>0;c--)
                for(int d=c-1;d>0;d--)
                {
                    if(abs(1.0/a+1.0/b+1.0/c+1.0/d-1)<eps)    cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
                }
    return 0;
}

1、思路:一共开了四瓶酒,船长喝了四杯,并且船长属于最后喝醉的那一拨,船长自己说四轮下来正好喝了整整一瓶酒,那么只要1/每拨留下的人数,累计四次的=1就行了。另外要注意IEEE754标准的浮点数不能用“==”操作符来写if语句的判定标准,故而要先定义一个最小值eps(相当于微积分里面的无限小,但总是不为0的概念)。

2、教训:(1)一开始没有写abs,导致出来一堆结果。。。做算法题不能粗心啊!

     (2)船长说的好:“开船(车)不喝酒,喝酒别开船(车)

tz@COI HZAU

2018/3/23

原文地址:https://www.cnblogs.com/acm-icpcer/p/8630978.html