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

质疑一个不怎么难的问题

taozztzz 发布于 2010-08-06 20:30, 1127 次点击
以下是从书上节选的内容(OCR扫描上来的,可能会有点小错误):

1.3个人比饭量大,每个人说了两句话。
A说:B比我吃得多,C和我吃得一样多。
B说:A比我吃得多,A也比C吃得多。
C说:我比B吃得多,B比A吃得多。

事实上饭量越小的人讲对的话越多。请编程按饭量的大小输出3
个人的顺序。

[算法分析]

首先,把每个人的饭量分别用整数1,2,3来表示,数字越大就表
示这个人的饭量越大,由于题目中A说的话中提到了有可能两个人的
饭量相同,也就是说代表3个人饭量的数字有可能相等。

用一个三重循环来枚举每个人的饭量,分别用A,B,C表示这3
个人的饭量。将这3个人说的话As,Bs,Cs写成表达式:

As=(B>A)+(C==A);
Bs=(A>B)+(A>C) ;
Cs=(C>B)+(B>A) ;

根据题意,饭量越小的人讲对的话越多,也就是说,不存在两个
人,其中一个人的饭量比另一个人小,且说对的话不比另一个人多。
当变量满足这个条件时,就可以输出这组解了。

[参考程序]

#include <iostream>
using namespace std;

int main()
{
    int A, B, C;    //定义3个人的饭量
    int As, Bs, Cs;    //定义3个人说的话
    int AnsA, AnsB, AnsC;    //用于记录最后的答案
    for (A = 1; A <= 3; A++)
        for (B = 1; B <= 3; B++)
            for (C = 1; C <= 3; C++)
            {
                As = (B>A) + (C==A);    //A讲的话
                Bs = (A>B) + (A>C) ;    //B讲的话
                Cs = (C>B) + (B>A) ;    //C讲的话
                if(!(A <= B && As <= Bs || A <= C && As <= Cs ||
                      B <= A && Bs <= As || B <= C && Bs <= Cs ||
                      C <= A && Cs <= As || C <= B && Cs <= Bs))
                //如果不存在一个人饭量比另一个人小,说对的话也不比另一个人多,则记录下这时的解
                {
                    AnsA = A;
                    AnsB = B;
                    AnsC = C;
                }
            }
    //输出部分省略
    return 0;
}


我觉得加红的代码很奇怪,题目之前说过“代表3个人饭量的数字有可能相等”,那么类似 A == B && As == Bs 的情况是有可能出现的,而这种情况恰是 A <= B && As <= Bs 的一个子集,这是相矛盾的。我觉得按照“如果不存在一个人饭量比另一个人小,说对的话也不比另一个人多,则记录下这时的解”这个条件,加红的部分,"="号应该全部去掉。

请大家帮忙看看,谢谢!                  
 
3 回复
#2
lijm19892010-08-07 01:01
个人意见,都说得通,但推荐书上的。。。
事实上饭量越小的人讲对的话越多。看这句话怎么理解了~~~
#3
taozztzz2010-08-13 19:48
但是我觉得书上说得完全没有道理啊!能解释一下吗?
#4
pangding2010-08-13 23:25
C 版有个和这个有点像的问题。https://bbs.bccn.net/viewthread.php?tid=315556&page=1
鉴于那边关注的人可能多些,你要以去参考一下。
1