谁家孩子跑最慢?
张王李三家各有三个小孩。一天,三家的九个孩子在一起比赛短跑,
规定不分年龄大小,跑第一得9分,跑第2得8分,依此类推。
比赛结果各家的总分相同,且这些孩子没有同时到达终点的,
也没有一家的两个或三个孩子获得相连的名次。
已知获第一名的是李家的孩子,获得第二的是王家的孩子。
问获得最后一名的是谁家的孩子?
算法分析
按题目的条件,共有1+2+3+…+9=45分,每家的孩子的得分应为15分。根据题意可知:获第一名的是李家的孩子,获第二名的是王家的孩子,则可推出:获第三名的一定是张家的孩子。由“这些孩子没有同时到达终点的”可知:名次不能并列,由“没有一家的两个或三个孩子获得相连的名次”可知:第四名不能是张家的孩子。
程序中直接用分数表示。
#include<stdio.h>
main()
{int score[4][4];score[1][1] = 7;//张姓家庭的孩子得第三名 score[2][1] = 8;//王姓家庭的孩子得第二名score[3][1] = 9;//李姓家庭的孩子得第一名for(int i = 4; i < 6; i++)//张姓孩子只可能拿五六名,故得分4-5for(int j = 4; j < 7; j++)//王姓孩子可能拿四-六名,故得分4-6for(int k = 4; k < 6; k++)//张姓孩子可能拿四-六名,故得分4-6 {if(i != j && i != k && k != j)//三家孩子的名次不能相同if(15-i-score[1][1]!=15-j-score[2][1]&&15-i-score[1][1]!=15-k-score[3][1]&&15-k-score[3][1]!=15-j-score[2][1]) //三家孩子在7-9名 名次不能相同 { score[1][2] = i;score[2][2] = j;score[3][2] = k;score[1][3] = 15-i-score[1][1];score[2][3] = 15-j-score[2][1];score[3][3] = 15-k-score[3][1];}} for(int i = 1; i < 4; i++){for(int j = 1; j < 4; j++){printf("%d ",score[i][j]);}printf("\n");}printf("\n");for(int i = 1; i < 4; i++){for(int j = 1; j < 4; j++){if(score[i][j]==1) {printf("%s",i==1?"张家孩子跑的慢!":"") ; printf("%s",i==2?"王家孩子跑的慢!":"") ; printf("%s",i==3?"李家孩子跑的慢!":"") ; } }}
}