• 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

  • 相关阅读:
    WinRAR5.01注册码附注册机
    PS不能存储,因为程序错误
    mysql中 date datetime time timestamp 的区别
    sublime text 3 3126 注册码+中文包
    IIS7.5 用 IIS AppPool应用程序池名 做账号 将各站点权限分开
    linux vi 报错 E37: No write since last change (add ! to override)
    Linux 安装 apache2.4.23
    三级分类及名称及列表
    二级栏目名称及列表
    每隔N行输出不同样式
  • 原文地址:https://www.cnblogs.com/acm-icpcer/p/8630978.html
Copyright © 2020-2023  润新知