2673:比赛排名

2018-01-15 17:12:54


2673:比赛排名

总时间限制: 1000ms 内存限制: 65536kB

描述 5名运动员参加100米赛跑,各自对比赛结果进行了预测:

A说:E是第1名。

B说:我是第2名。

C说:A肯定垫底。

D说:C肯定拿不了第1名。

E说:D应该是第1名。

比赛结束后发现,只有获第1名和第2名的选手猜对了,E不是第2名和第3名,没有出现名次并列的情况。

请编程判断5位选手各是第几名。

输入 无 输出 输出要求:按ABCDE的顺序输出5行,其中第1行是A的名次,第2行是B的名次,

第3行是C的名次,第4行是D的名次,第5行是E的名次。

样例输入:无

样例输出:无

题目分析:

a一定不是第一:是第一说真话,还会说别人是第一?

e也不是第一:原因和a一样;还有,e不是第二(因为题目说e不是2和3),e就只能四五!d也不是第一!

所以a不是第一和第二,自然a,e别想拿一二名。

现在,只有b和c能拿第一,b却不行,因为a和e也是一样!

c第一,d就是撒谎,ae也不能拿第二,b第二咯!

话说c是说真话的第一,那么a就是垫底!(a第五)

e不能3,只有4;

d只剩下3.

代码较为复杂,可以直接手推出来!

    #include<cstdio>
    int main()
    {
        for(int a=1; a<6; a++)
            for(int b=1; b<6; b++)
                if(a!=b)
                    for(int c=1; c<6; c++)
                        if(c!=a&&c!=b)
                            for(int d=1; d<6; d++)
                                if(d!=a&&d!=b&&d!=c)
                                    for(int e=1; e<6; e++)
                                        if(e!=a&&e!=b&&e!=c&&e!=d&&e!=2&&e!=3)
                                            if(a>=3^e==1)
                                                if(b>=3^b==2)
                                                    if(c>=3^a==5)
                                                        if(d>=3^c!=1)
                                                            if(e>=3^d==1)
                                                                printf("%d\n%d\n%d\n%d\n%d",a,b,c,d,e);
        return 0;
    }