P1014 [NOIP 1999 普及组] Cantor 表

题解:洛谷 P1014 [NOIP 1999 普及组] Cantor 表 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。我们以 Z 字形给上表的每一项编号。本文分享的必刷题目是从。#普及-# #模拟# 阅读详情

记录136

#include<bits/stdc++.h>
using namespace std;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,a=1,b=1; //n次变动  a是分子,b是分母 
	bool f=1; // 到边界后,true向右边走  false向下走 
	cin>>n; //输入n 
	n=n-1; //第一次已经在1/1位置了,所以实际移动n-1次 
	while(n--){ //开始移动 
		if(a==1&&f){ //到最上面了,向右走 
			b++,f=0; //向右走一格,后面到边界向下走 
		}else if(b!=1&&!f){ //没走到最左边,并且到边界是向下走 
			a++,b--; // 到当前位置的左下位置 
		}else if(b==1&&!f){ //到最左边了 , 向下走 
			a++,f=1; //向下走,后面到边界向右走 
		}else if(a!=1&&f){ //没走到最上面,并且到边界是向右走 
			a--,b++; //到当前位置的右上位置 
		}
	}
	cout<<a<<"/"<<b<<"\n";//输出 
	return 0;//程序正常结束
}

题目传送门https://www.luogu.com.cn/problem/P1014


前言

我是一名专注信奥赛(CSP-J/S、NOIP)的教练。

  • 如果你觉得这篇题解对你有帮助,欢迎点击关注我的优快云账号,我会持续更新高质量算法解析。
  • 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
  • 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。

核心解题思路

这道题是一道经典的找规律与模拟问题。题目要求我们按照“Z字形”遍历一个无限的有理数表,并输出第 N 项。

  1. 观察 Z 字形规律:
    我们将有理数表看作一个二维坐标系,分子 a 代表行,分母 b 代表列。观察题目给出的遍历顺序:

    • 1/1 (起点)
    • 1/2 (向右移动)
    • 2/1 (向左下移动)
    • 3/1 (向下移动)
    • 2/2 (向右上移动)
    • 1/3 (向右上移动)
    • 1/4 (向右移动)
      ...

    我们可以发现,移动轨迹只有四种基本状态:

    • 向右平移:当处于第一行且当前方向是向右上时,只能向右走一格,然后方向变为向左下。
    • 向左下斜移:只要不在第一列且方向是向左下,就不断向 a+1, b-1 移动。
    • 向下平移:当处于第一列且当前方向是向左下时,只能向下走一格,然后方向变为向右上。
    • 向右上斜移:只要不在第一行且方向是向右上,就不断向 a-1, b+1 移动。
  2. 模拟算法设计:
    由于 N 最大为 10^7,使用 O(N) 的循环模拟是可以接受的。我们只需要设置两个变量 a(分子)和 b(分母),以及一个布尔变量 f 来记录当前是在“向右上走”还是“向左下走”,按照上述四种情况逐步移动 N-1 次即可得到结果。


代码分块详细解释

1. 头文件、变量定义与初始化

#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false); // 关闭标准流同步,提升输入输出效率
    cin.tie(0); // 解除cin与cout的绑定,加快读取速度
    int n, a=1, b=1; // n次变动,a是分子,b是分母 
    bool f=1; // 到边界后,true代表向右边走(向右上),false代表向下走(向左下) 
  • 详细分析:这里定义了核心的状态变量。a 和 b 初始化为 1,代表起点 1/1。布尔变量 f 是控制移动方向的关键标志位。f=1 (true) 表示当前的斜线方向是向右上(分子减小,分母增大);f=0 (false) 表示当前的斜线方向是向左下(分子增大,分母减小)。

2. 输入处理与步数修正

    cin>>n; // 输入n 
    n=n-1; // 第一次已经在1/1位置了,所以实际移动n-1次 
  • 详细分析:因为我们的起点 a=1, b=1 已经对应了第 1 项,所以如果要求第 N 项,实际上只需要在起点的基础上再移动 N-1 步。这一步处理避免了循环多执行一次。

3. 核心循环:Z字形移动模拟

    while(n--){ // 开始移动,循环执行 n-1 次
        if(a==1 && f){ // 到最上面了,向右走 
            b++, f=0; // 向右走一格(分母+1),后面到边界向下走(方向变为向左下)
        } else if(b!=1 && !f){ // 没走到最左边,并且到边界是向下走 
            a++, b--; // 到当前位置的左下位置(分子+1,分母-1)
        } else if(b==1 && !f){ // 到最左边了 , 向下走 
            a++, f=1; // 向下走(分子+1),后面到边界向右走(方向变为向右上)
        } else if(a!=1 && f){ // 没走到最上面,并且到边界是向右走 
            a--, b++; // 到当前位置的右上位置(分子-1,分母+1)
        }
    }
  • 详细分析:这是代码的灵魂部分,利用 if-else if 结构完美覆盖了四种移动状态。
    • 状态 1(右上角边界):a==1 && f。当我们在第一行且原本打算向右上走时,会被边界挡住,此时只能向右平移一格(b++),并且将方向 f 翻转为 0(准备向左下走)。
    • 状态 2(向左下斜移):b!=1 && !f。只要不在第一列(b!=1)且方向是向左下(!f),就沿着对角线向左下移动(a++, b--)。
    • 状态 3(左下角边界):b==1 && !f。当我们在第一列且原本打算向左下走时,会被边界挡住,此时只能向下平移一格(a++),并且将方向 f 翻转为 1(准备向右上走)。
    • 状态 4(向右上斜移):a!=1 && f。只要不在第一行(a!=1)且方向是向右上(f),就沿着对角线向右上移动(a--, b++)。

4. 结果输出

    cout<<a<<"/"<<b<<"\n"; // 输出 
    return 0; // 程序正常结束
}
  • 详细分析:循环结束后,a 和 b 中存储的就是第 N 项对应的分子和分母,按照题目要求的格式输出即可。

 核心逻辑总结表

代码模块核心变量/操作精炼作用解决的痛点
状态初始化a=1, b=1, f=1设定起点与初始方向确立了模拟的基准状态,f=1 代表初始趋势向右上
步数修正n = n - 1排除起点占用的第1项避免循环多执行一次,确保移动次数准确
右上边界处理if(a==1 && f)处理第一行的向右平移解决向右上移动碰到顶墙时的转向与平移问题
左下边界处理else if(b==1 && !f)处理第一列的向下平移解决向左下移动碰到左墙时的转向与平移问题
对角线移动a++,b-- 与 a--,b++实现Z字形的斜向遍历在两个边界之间来回穿梭,完美复刻康托尔表的规律
方向翻转f=0 与 f=1切换斜线移动的方向保证每次碰到边界后,下一次斜移的方向必然改变
Xtract or Ucfyber的最条理的整理入门级教程 XTRACT可以对任意截面进行全过程截面分析。工程中常用来分析各种截面(如异形柱、组合截面等)的非线性特征点及承载力校核。 xtract主要思路也是根据各种材料本构关系,基于平截面假定,用fiber划分截面进行全过程非线性分析。...... 阅读详情

相关推荐

免Root抓包神器Packet Capture:安卓App数据捕获全攻略

本文详细介绍了免Root安卓抓包神器Packet Capture的安装与使用全攻略。通过利用安卓系统的VPN Service API,该工具无需Root权限即可捕获并解密App的HTTP/HTTPS网络流量。文章从核心原理、证书安装、实战抓包步骤到结果分析与常见问题排查,提供了完整指南,是移动端开发、安全测试和数据分析的实用利器。

weixin_29232507的博客 1081

P1014 [NOIP1999 普及组] Cantor 表

今天zty带来的是 P1014 [NOIP1999 普及组] Cantor 表 ,大家给个赞呗,zty还要上学,发作品会少一点先 赞 后 看 养 成 习 惯先 赞 后 看 养 成 习 惯。

zty20120913的博客 898

实战案例:用多智能体系统模拟房地产市场的架构设计

房地产市场是典型的复杂自适应系统:买方纠结“要不要上车”、卖方盘算“挂多少钱能快速成交”、中介忙着“撮合两边赚佣金”、政府琢磨“怎么调政策稳房价”——每一个参与者的微小决策,最终都会汇聚成“房价暴涨”“成交冰点”这样的宏观现象。传统的计量经济学模型(比如线性回归)假设“所有人都是理性人”,但现实中没人能算清所有变量——你可能因为“同事买了学区房”就跟风,也可能因为“怕失业”而放弃买房。这时候,多智能体系统(MAS)

移动开发前沿的博客 1124

P1014 [NOIP 1999 普及组] Cantor 表 c++题解

本文介绍了NOIP 1999普及组题目"Cantor表"的解题方法。题目要求按照Z字形顺序输出有理数表中的第N项。解题核心是采用分组模拟法:首先确定目标数所在的斜行k,然后根据斜行奇偶性决定移动方向(奇数行向左上,偶数行向右下),最终通过数学计算确定分子分母。算法时间复杂度为O(√N),适用于大范围数据。文章提供了完整的C++代码实现,并附有测试样例和相关题目推荐。该解法通过数学推导优化了传统模拟方法,避免全表遍历,提高了效率。

syshrgjdkdh的博客 1091

【魔兽世界插件】魔兽世界插件实战笔记从入门到放弃的心理历程 第一节 lua框架的建立

魔兽世界插件实战笔记从入门到放弃的心理历程 第二节 lua框架的建立 找到魔兽世界的安装目录,找到插件的默认位置:\World of Warcraft\_retail_\Interface\AddOns,在这里建立一个文件夹,魔兽的插件都是用一个文件夹来区分的,第一课吗,就用Lesson_one吧。 下面建立的三个文件,第一个点toc文件是最重要的一个,它是魔兽客户端识别插件的一个标识符。 魔兽版本号有一个函数可以查询在WoWLua下面运行:print("当前游戏版本号:",(select(4,GetBui

qq_33075391的博客 6450

104报文解析工具

可选择包含报文的文本文件或日志文件进行解析,可选择按条数范围或时间范围,输出结果可以在报文解析显示区,也可以输出到文件。可以对文本内容的报文文件进行高级分析,包括遥信遥测等通讯数据的具体信息,通讯帧的统计,通讯次数的统计,各种错误的分析,报文的定位功能,传输的文件具体内容等。输入完成后点击工具栏的解析报文按钮或使用右键菜单的解析就可以对报文进行解析。在报文输入区输入待解析报文并解析后,解析结果就显示在报文解析显示区和报文定位展示区及报文定位条目区。当有多条报文解析后,可以通过报文列表树具体定位某条报文。

XZHOUMIN的博客 5951

【题解】【洛谷P1014】【枚举】—— [NOIP1999 普及组] Cantor 表

现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。我们以 Z 字形给上表的每一项编号。那么就根据这两个要求模拟就行了。·大任务:枚举分子分母和为。的顺序输出,否则按分子。

Pantheraonca的博客 1190

YOLO11涨点优化:知识蒸馏 | 引入FGD(Focal and Global Distillation)蒸馏,让轻量学生模型汲取大模型全局感知力

文章摘要 目标检测模型YOLO11在轻量化部署中存在"全局盲区"问题,即轻量模型感受野不足导致大尺度场景下性能下降。知识蒸馏技术FGD(Focal and Global Distillation)通过双分支机制有效解决这一问题:Focal Distillation分离前景背景特征,让学生模型聚焦关键区域;Global Distillation传递像素间关系信息,弥补全局感知缺陷。实验表明,FGD可使YOLO11轻量版mAP提升2.5%以上,且不增加推理耗时。本文详细解析了FGD原理,并给出YOLO11上的实

2601_95807009的博客 229

洛谷 P1014 [NOIP 1999 普及组] Cantor 表

本文介绍了如何解决洛谷P1014 Cantor表问题。通过观察表中数字的排列规律,可以推导出计算第N项所在行号和位置的方法。关键在于将表格旋转45度后找到行号与数字位置的数学关系,并通过奇偶性判断分子分母的顺序。最终用简洁的公式实现,代码在C++和Python中均可高效运行。题目难度适中,主要考察数学推导能力。

jzwalliser的博客 187

Amber&pdb4amber | 准备PDB文件

PDB文件中唯一需要或有用的数据来设置AMBER模拟是:原子名称,残基名称,也许还有链标识符(如果存在多条链),以及重原子的坐标。除非加载额外的文库,否则非蛋白质结构(特别是低分子量配体)会引起问题;如果它们在PDB文件中的名称对应于AMBER库中的内部名称,则通常会识别水和单原子离子。–dry选项移除结构中的结晶水和–reduce选项在最理想的位置添加氢原子.为tleap程序调整从外部获得的PDB文件。

ASKCOS博客 898

Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案

本博客在总结这些问题及其解决方案,为遇到类似问题的兄弟提供参考,如果我后续有碰到其他Docker 问题也会在此更新补充。

我其实什么都不会 1646

P1014 [NOIP1999 普及组] Cantor 表 题解

P1014 [NOIP1999 普及组] Cantor 表 题解

yaosichengalpha的博客 1083

R数据分析:潜在剖面分析LPA的做法与解释

Latent Profile Analysis (LPA) tries to identify clusters of individuals (i.e., latent profiles) based on responses to a series of continuous variables (i.e., indicators). LPA assumes that there are unobserved latent profiles that generate patterns of resp.

Codewar的博客 1万+

【洛谷每日一题】P1014 [NOIP1999 普及组] Cantor 表

现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:我们以 Z 字形给上表的每一项编号。第一项是1/1,然后是1/22/13/12/2,…

CoderAlice 1216

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

洛谷 P1014 [NOIP 1999 普及组] Cantor 表 python

奇数行:前面的数为行数递减,后面的数从1递增到行数。如图所示,第几行就有几个数据。

qq_57844679的博客 351

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

P1014 [NOIP1999 普及组] Cantor 表 【中】

P1014 [NOIP1999 普及组] Cantor 表 https://www.luogu.com.cn/problem/P1014 题目大致给的意思是这样的: 分析以下题目应该是找规律题 , 将上图写成这样 不难找出,奇数行是一种规律,偶数行是另一种规律。 且 分子+ 分母 = 层数+1 例子: 1/5 1+5=5(层数)+1 规律找出了那么问题的关键是找到 ...

bettle_king的博客 516

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

每日一题洛谷P1014 [NOIP 1999 普及组] Cantor 表c++

【代码】每日一题洛谷P1014 [NOIP 1999 普及组] Cantor 表c++

2401_88089822的博客 294

P1014 [NOIP1999 普及组] Cantor 表【数学规律】

现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。我们以 Z 字形给上表的每一项编号。第一项是 1/1,然后是 1/2,2/1,3/1,2/2,…数学规律问题,不解释。整数N(1≤N≤10。

海岛Blog 514

洛谷P1014(Cantor 表[NOIP 1999 普及组])题解

洛谷P1014详解5000字

2201_75316840的博客 642

洛谷 P1014 [NOIP1999 普及组] Cantor 表 | OpenJudge NOI 2.1 8760:Cantor表

【题目链接】 洛谷 P1014 [NOIP1999 普及组] Cantor 表 【题目考点】 1. 二维数组 2. 找规律 3. 两下标间元素数量 数组中下标a到下标b间元素个数n(包括下标a和下标b的元素) n = b-a+1 【解题思路】 先为每条斜线编号 假设有一个焦点位置不断移动,每移动一次,编号加1。 根据题目中给定的编号规律,可以得知: 当i为奇数时:焦点从i/1出发,从左下到右上移动到1/i 当i为偶数时:焦点从1/i出发,从右上到左下移动到i/1 第1条斜线上有1/1,1个格子 第2条

君义NOIP的博客 965

【洛谷Java】P1014 [NOIP1999 普及组] Cantor 表

@【洛谷Java】P1014 [NOIP1999 普及组] Cantor 表 欢迎 题目描述及输入输出要求: 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 1/1 , 1/2 , 1/3 , 1/4, 1/5, … 2/1, 2/2 , 2/3, 2/4, … 3/1 , 3/2, 3/3, … 4/1, 4/2, … 5/1, … … 我们以 Z 字形给上表的每一项编号。第一项是 1/1,然后是 1/2,2/1,3/1,2/2,… 输入格

weixin_46987000的博客 469
上一篇: P15801 [GESP202603 六级] 完全二叉树
下一篇: P1700 [USACO19OPEN] Milk Factory B
谢天谢地AC了 | 信奥教练
博客等级 码龄1年 53粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值