标题:一道推理问题。求其他算法。
只看楼主
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
结帖率:100%
已结贴  问题点数:10 回复次数:3 
一道推理问题。求其他算法。
对于以下推理要求,我的思路是随机取数,但在取数时还是按前两条件设定,再去撞第三个条件,如果撞上了能够满足,即得出结论,没撞上,则利用循环操作重取随机数。当然,这种“没头苍蝇”式的算法可能在运算量上不太优化。如果各位高人有更优的算法,请分享分享。
/*
推理游戏
妈妈买了苹果,雪梨,橙子,火龙果四种水果,它们的数量如下:
1. 火龙果比橙子数量多;
2. 苹果、雪梨两种水果合在一起的数量与火龙果、橙子两种水果合在一起的数量恰好一样多;
3. 雪梨、橙子的数量合起来,比苹果、火龙果两种水果合起来的数量要多。

请问,妈妈买的哪种水果数量最多,哪种第二,哪种第三?
*/
#include<iostream>
#include<time.h>
#include<vector>
#include<algorithm>
using namespace std;
struct fruit
{
    char name[7];//名称
    unsigned short n;//数量
};
bool Descend(fruit f1,fruit f2)//按数量由大到小排列的函数
{return f1.n>f2.n;}
int main()
{
    fruit MyFruit[5];char choice;
    do
    {
        strcpy(MyFruit[0].name,"apple");
        strcpy(MyFruit[1].name,"pear");
        strcpy(MyFruit[2].name,"orange");
        strcpy(MyFruit[3].name,"dragon");
        strcpy(MyFruit[4].name,"none");
        do
        {
            MyFruit[3].n=(unsigned short)(rand()%19+2);
            //随机设置火龙果数量(2-20个),火龙果要比橙子多,至少有两个
            
            MyFruit[2].n=(unsigned short)(rand()%(MyFruit[3].n-1)+1);
            //根据条件设置橙子数量
            
            MyFruit[0].n=(unsigned short)(rand()%(MyFruit[3].n+MyFruit[2].n-1)+1);
            //随机设置苹果数量,使之小于火龙果和橙子之和
            
            MyFruit[1].n=MyFruit[3].n+MyFruit[2].n-MyFruit[0].n;
        }while(MyFruit[1].n+MyFruit[2].n<=MyFruit[0].n+MyFruit[3].n);//如不满足条件三,重新取随机值
        sort(&(MyFruit[0]),&(MyFruit[4]),Descend);
        cout<<"最多:\t"<<MyFruit[0].name<<"\t"<<MyFruit[0].n<<"个\n";
        cout<<"第二:\t"<<MyFruit[1].name<<"\t"<<MyFruit[1].n<<"个\n";
        cout<<"第三:\t"<<MyFruit[2].name<<"\t"<<MyFruit[2].n<<"个\n";
        cout<<"第四:\t"<<MyFruit[3].name<<"\t"<<MyFruit[3].n<<"个\n";
        cout<<endl<<"是否尝试其他可能性?(y/n)";
        cin>>choice;
    }while(choice=='Y'||choice=='y');
    return 0;
}
搜索更多相关主题的帖子: 火龙果 苹果 水果 雪梨 游戏 
2016-04-10 20:40
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:5 
苹果a,雪梨b,橙子c,火龙果d

先列算式
d > c
a+b = c+d
b+c > a+d

因为 a+b=c+d 且 b+c>a+d, 所以 最大值不是b就是c
因为 最大值不是b就是c 且 d>c,所以最大值是b
因为 最大值是b 且 a+b = c+d,所以最小值是a
因为 最大值是b,最小值是a,且 d>c,所以从大到小是 b d c a
2016-04-11 11:01
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:0 
回复 2楼 rjsp
理解到了。
又发现一种推理
因为
a+b, c+d均为总数的一半
b+c大于总数的一半且a+d小于总数的一半
故c>a
已知d>c
在a+b=c+d平衡关系中,因为a比c,d都小,所以b必须最大。
得到b d c a
2016-04-11 12:41
c974288432
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:44
专家分:104
注 册:2015-7-18
得分:5 
format("%d",a)
format(_T("%d",a))
加了_T  做什么
2016-04-12 11:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-463493-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064370 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved