一道推理问题。求其他算法。
对于以下推理要求,我的思路是随机取数,但在取数时还是按前两条件设定,再去撞第三个条件,如果撞上了能够满足,即得出结论,没撞上,则利用循环操作重取随机数。当然,这种“没头苍蝇”式的算法可能在运算量上不太优化。如果各位高人有更优的算法,请分享分享。/*
推理游戏
妈妈买了苹果,雪梨,橙子,火龙果四种水果,它们的数量如下:
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;
}