洛谷P1014[NOIP 1999 普及组] Cantor 表 题解
1.洛谷P1028 [NOIP 2001 普及组] 数的计算 题解2.洛谷P1464 Function 题解3.洛谷P2440 木材加工 题解4.洛谷P2678 [NOIP 2015 提高组] 跳石头 题解5.洛谷P1314 [NOIP 2011 提高组] 聪明的质监员 题解6.洛谷P1083 [NOIP 2012 提高组] 借教室 题解7.洛谷P1902 刺杀大使 题解8.洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 题解9.洛谷P2280 [HNOI2003] 激光炸弹 题解10.洛谷P8218 【深进1.例1】求区间和 题解11.洛谷 P1719 最大加权矩形 题解12.洛谷 P2367 语文成绩 题解13.洛谷P1387 最大正方形 题解
14.洛谷P1014[NOIP 1999 普及组] Cantor 表 题解
15.洛谷P1563 [NOIP 2016 提高组] 玩具谜题 题解16.洛谷P4924 [1007] 魔法少女小Scarlet 题解17.洛谷P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two 题解18.洛谷P1786 帮贡排序 题解19.洛谷P1990 覆盖墙壁 题解20.洛谷P1010 [NOIP 1998 普及组] 幂次方 题解21.洛谷P1259 黑白棋子的移动 题解22.洛谷P1281 书的复制 题解23.洛谷P1396 营救 题解24.洛谷PP1570 KC 喝咖啡25.洛谷P1661 扩散 题解26.洛谷P1843 奶牛晒衣服 题解P1014[NOIP 1999 普及组] Cantor 表 题解
题目
题解
思路
这是一道有意思的经典递推题目。
通过肉眼观察和枚举样例理解,不难发现,第\(x\)条“/”斜线上有\(x\)项元素,当\(x\mod2=0\)时,第\(i\)项\(a_i\)/\(b_i\)中的分子\(a\)是从1递增到\(x\)的,分母\(b\)是从\(x\)递减到1;反之同理,当\(x\mod2=1\)时,\(a\)从\(x\)递减到1,\(b\)从1递增到\(x\)。
使用一个while循环\(while(!ok)\),\(ok\)初值为0。定义一个变量\(l\)表示当前在第\(l\)条斜线上,当\(l\mod2=0\)时,内部while循环为\(while(a<l)\),否则循环为\(while(b<l)\)
每次外部while循环内,先是依据\(l\mod2\)的结果判断,如果\(l\mod2=0\),则\(a=0,b=l+1\),否则\(a=l+1,b=0\),其次在内部while循环内,当\(l\mod2=0\)时,每次\(a++,b--\),否则每次\(a--,b++\),每次操作完后,进行计数器自增\(cnt++\),若\(cnt=n\)(即已经求到第\(n\)项了),就将\(ok\)设置为1并break,否则在每次内部while循环结束后,将\(l++\)。
最后输出\(a\)/\(b\)即可。
代码
#include<bits/stdc++.h> #define endl '\n' using namespace std; const long long INF = 0x3f3f3f3f; const double EPS = 1e-8; int n; bool ok; int main(){ cin>>n; int cnt=0,l=1,a=0,b=2; while(!ok){ if(l%2==0) { a=0; b=l+1; }else{ a=l+1; b=0; } while((l%2==0?(a<l):(b<l))){ if(l%2==0) { a++; b--; }else{ a--; b++; } cnt++; if(cnt==n){ ok=1; break; } } l++; } cout<<a<<'/'<<b<<endl; return 0; }
本文作者:2789617221guo
本文链接:https://www.cnblogs.com/2789617221guo/p/18706794
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步