头图

算法经典题:谁家孩子跑的最慢

瞿小凯

问题描述
假设有张王李三家,每家都有3个孩子。某一天,这三家的9个孩子一起比赛短跑,规定不考虑年龄大小,第1名得9分,第2名得8分,第3名得7分,依次类推。比赛结束后统计分数发现三家孩子的总分是相同的,同时限定这9个孩子的名次不存在并列的情况,且同一家的孩子不会获得相连的名次。现已知获得第1名的是李家的孩子,获得第2名的是王家的孩子,要求通过算法求出获得最后一名的是哪家的孩子。
图片.png

思路:
题目内容有点多,不过数据挺有规律,首先,我们可以看出参加比赛的孩子得分可以看出,其总分为:

#include <stdio.h>
int main(void)
{

    int i;
    int sum = 0;
    for (i = 1; i <= 9; i++)
        sum += i;
    printf("%d", sum);
    return 0;
}

总分输出:
45

由于比赛结束后统计分数发现三家孩子的总分是相同的,因此每家孩子的得分都为
45/3=15 //每家孩子分数为15分

我们有了以上规律,将数据填入表格,设计算法估算对应数据即可,这里,我们横轴表示家庭,纵轴表示分数。
图片.png

因此,我们由题意得出结论:

score[1][1]+score[1][2]+score[1][3]=15
score[2][1]+score[2][2]+score[2][3]=15
score[3][1]+score[3][2]+score[3][3]=15

另外,考虑不存在并列的情况,因此我们做排除法

score[1][2]+score[2][2]!=score[3][2]
score[1][3]+score[2][3]!=score[3][3]

另外,根据题目中已知的“获得第1名的是李家的孩子,获得第2名的是王家的孩子”,因此
score1、score2的数据可以很好的定位,也方便其他数据的计算。
利用循环体搜索,我们的完整的代码为:

    #include <stdio.h>
    int main()
    {
        int score[4][4];
        int zhang, wang, li, last, i, j;
        score[1][1]=7;  /*score[1]存放张家三个孩子的分数*/
        score[2][1]=8;  /*score[2]存放王家三个孩子的分数*/
        score[3][1]=9;  /*score[3]存放李家三个孩子的分数*/
        for(zhang=4; zhang<6; zhang++)  /*张家孩子在4到6分段可能取值的分数为4,5,不能取6*/
            for(wang=4; wang<7; wang++)  /*王家孩子在4到6分段可能取值的分数为4,5,6*/
                for(li=4; li<7; li++)  /*李家孩子在4到6分段可能取值的分数为4,5,6*/
                    if(zhang!=wang && li!=zhang && li!=wang
                       && 15-zhang-score[1][1]!=15-wang-score[2][1]  /*9个孩子名次不存在并列的情况*/
                       && 15-zhang-score[1][1]!=15-li-score[3][1]
                       && 15-wang-score[2][1]!=15-li-score[3][1])
                    {
                        score[1][2]=zhang;  /*将结果存入对应的数组元素*/
                        score[1][3]=15-zhang-7;
                        score[2][2]=wang;
                        score[2][3]=15-wang-8;
                        score[3][2]=li;
                        score[3][3]=15-li-9;
                    }
       
        printf("array score:\n");  /*打印二维数组score,输出各家孩子的分数*/
        for(last=0, i=1; i<=3; i++)
            for(j=1; j<=3; j++)
            {
                printf("%d", score[i][j]);
                printf(" ");
                if(j == 3)
                    printf("\n");  /*每输入三个值换行*/
                if(score[i][j] == 1)
                    last=i;  /*记录最后一名孩子所来自的家庭*/
            }
        /*输出最后一名孩子来自的家庭*/
        if(last == 1)
            printf("The last one reached the end is a child from family Zhang.\n");
        else if(last == 2)
            printf("The last one reached the end is a child from family Wang.\n");
        else
            printf("The last one reached the end is a child from family Li.\n");
       
        return 0;
    }

运行结果为:
图片.png

将数据带入表格对应位置,即为我们想要的正确答案。

阅读 227

我是一个独立思考,喜欢纯粹的人,文科和专科是我曾经的身份牌,技术是我一直的理想。

69 声望
3 粉丝
0 条评论

我是一个独立思考,喜欢纯粹的人,文科和专科是我曾经的身份牌,技术是我一直的理想。

69 声望
3 粉丝
文章目录
宣传栏