注册 登录
编程论坛 C++教室

一道推理问题。求其他算法。

yangfrancis 发布于 2016-04-10 20:40, 4290 次点击
对于以下推理要求,我的思路是随机取数,但在取数时还是按前两条件设定,再去撞第三个条件,如果撞上了能够满足,即得出结论,没撞上,则利用循环操作重取随机数。当然,这种“没头苍蝇”式的算法可能在运算量上不太优化。如果各位高人有更优的算法,请分享分享。
/*
推理游戏
妈妈买了苹果,雪梨,橙子,火龙果四种水果,它们的数量如下:
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;
}
3 回复
#2
rjsp2016-04-11 11:01
苹果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
#3
yangfrancis2016-04-11 12:41
回复 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
#4
c9742884322016-04-12 11:24
format("%d",a)
format(_T("%d",a))
加了_T  做什么
1