原题链接:C语言训练-谁家孩子跑最慢*
思路
穷举。
可以做一些优化。例如写成下面这样,
for (int x = 1; x < 10; x++)
for (int y = x + 2; y < 10; y++)
for (int z = y + 2; z < 10; z++)
可以确保 3 个数之间互不相同,互不相邻,且没有重复组合。
代码
#include <iostream>
int main()
{
const int MAX = 8; // 9 和 8 已经确定了,只能选择 [1, 7]
const int c = 9;
const int k = 8;
// 李家
for (int a = 1; a < MAX; a++)
{
for (int b = a + 2; b < c - 1; b++)
{
// 每家总分为15
if (15 != a + b + c)
{
continue;
}
// 第二家
for (int i = 1; i < MAX; i++)
{
for (int j = i + 2; j < k - 1; j++)
{
// 每家总分为15
if (15 != i + j + k)
{
continue;
}
// 没有相同的名次,即 [1, 9] 每个数字只能使用一次
if (i == a || i == b || i == c ||
j == a || j == b || j == c ||
k == a || k == b || k == c )
{
continue;
}
// 第三家
for (int x = 1; x < MAX; x++)
{
for (int y = x + 2; y < MAX; y++)
{
for (int z = y + 2; z < MAX; z++)
{
// 每家总分为15
if (15 != x + y + z)
{
continue;
}
// 没有相同的名次,即 [1, 9] 每个数字只能使用一次
if (x == a || x == b || x == c ||
y == a || y == b || y == c ||
z == a || z == b || z == c ||
x == i || x == j || x == k ||
y == i || y == j || y == k ||
z == i || z == j || z == k )
{
continue;
}
// 符合要求,最后一名即 1 分
if (1 == a) std::cout << "L";
if (1 == i) std::cout << "W";
if (1 == x) std::cout << "Z";
return 0;
}
}
}
}
}
}
}
return 0;
}
2020-01-01 00:08:55 星期三
8.7 分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复