1 条题解
-
0
P1663. 数字台阶 题解
题目分析
题目要求根据平面上点的坐标 ,判断该点是否写有数字,若有则输出对应的数字,否则输出 。根据题目描述,数字的分布遵循以下规律:
- 数字从 开始按特定模式排列。
- 有效坐标需满足两种模式之一:
- 点在直线 上(称为“上对角线”);
- 点在直线 上(称为“下对角线”)。
规律总结
通过观察示例和推导,可得出以下结论:
- 有效坐标条件: 必须满足 或 ,且 。
- 数字计算规则:
- 若 (上对角线):
- 当 为偶数时,数字为 ;
- 当 为奇数时,数字为 。
- 若 (下对角线):
- 当 为偶数时,数字为 ;
- 当 为奇数时,数字为 。
- 若 (上对角线):
算法思路
- 输入处理:读取测试用例数 ,逐个处理每个坐标 。
- 有效性判断:检查 是否满足 或 ,且 。不满足则输出 。
- 数字计算:根据坐标所属的对角线类型(上或下)及 的奇偶性,计算对应的数字并输出。
代码解释
#include <iostream> #include <cstdio> using namespace std; int main() { int T; scanf("%d", &T); // 读取测试用例数 int x, y; bool isAbove, isLower; // 判断是否属于上/下对角线 for (int t = 0; t < T; ++t) { scanf("%d%d", &x, &y); // 读取坐标 (x, y) isAbove = (y == x); // 是否属于上对角线(y = x) isLower = (y == x - 2); // 是否属于下对角线(y = x - 2) // 无效情况:不满足上/下对角线,或坐标为负数 if ((!isAbove && !isLower) || x < 0 || y < 0) { printf("No Number\n"); continue; } // 根据对角线类型和x的奇偶性计算数字 if (isAbove) { // 上对角线(y = x) if (x % 2 == 0) { printf("%d\n", x * 2); // x为偶数:2x } else { printf("%d\n", x * 2 - 1); // x为奇数:2x - 1 } } else { // 下对角线(y = x - 2) if (x % 2 == 0) { printf("%d\n", x * 2 - 2); // x为偶数:2x - 2 } else { printf("%d\n", x * 2 - 3); // x为奇数:2x - 3 } } } return 0; }
示例验证
以题目示例输入为例:
3 4 2 // 属于下对角线(y = 4-2=2),x=4(偶数),数字为 4*2-2=6 → 输出6 6 6 // 属于上对角线(y=6),x=6(偶数),数字为6*2=12 → 输出12 3 4 // 不满足y=3(3≠4)且不满足y=3-2=1(1≠4)→ 输出No Number
输出结果与示例完全一致,验证了代码的正确性。
复杂度分析
- 时间复杂度:,其中 为测试用例数。每个测试用例的处理仅需常数时间。
- 空间复杂度:,仅使用固定额外空间。
- 1
信息
- ID
- 664
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者