【1083】code[vs] 1083 Cantor表 1999年NOIP全国联赛普及组

嘿嘿嘿,又是一发水题……

【传送门】:http://codevs.cn/problem/1083/

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>原题>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

1083 Cantor表                                1999年NOIP全国联赛普及组

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 白银 Silver

题目描述 Description

现代数学的著名证明之一是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,…

输入描述 Input Description

整数N(1≤N≤10000000)

输出描述 Output Description

表中的第N项

样例输入 Sample Input

7

样例输出 Sample Output

1/4

数据范围及提示 Data Size & Hint

见描述
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>题目分析>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
一眼看去,还以为要一个个枚举,把整个表打出来,然后发现图越看越熟悉,将图旋转一下,这不就是小学书上的数字金字塔之类的吗mdzz……

很明显的嘛*&¥……不是吗?

嗯,然后呢,可以发现每行结束【单数行的结束的数在最右边,偶数行相反】的数的序号很明显就是【i表示第i行】【就是那个高斯求和公式(首项+末项)*项数/2  化简后得出的结果】,而每行的开始那个数的序号就是-i+1 , 所以要想知道给定序号的数在第几行,就可以从第一行到4500行进行枚举【这个4500是我用FOR循环估算出当n=4500时大致接近10000000时(大概一千万过一点)】,当第一次发现给出的n小于时就说明找到了第n个所在的行数i,然后进行处理后跳出循环输出结果就OK了啊

然后发现数的规律【一下都是旋转之后的状态】是单数行的分子都是从左往右递增,偶数行的分子从右往左递增,对应行的分母刚好相反滴,知道规律就好办了嘛……一言不合上代码……

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>我的代码>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


var
u,d,n,i:longint;
begin
read(n);
for i:= 1 to 4500 do
if (i+i*i) div 2>= n then

                     begin
if odd(i) then begin//如果是单数行就是分子从左往右递增,

                                          u:=(i+i*i) div 2-n+1;
d:= n+i-(i+i*i) div 2;
end
else begin//偶数行和单数行相反
d:=(i+i*i) div 2-n+1;
u:= n+i-(i+i*i) div 2;
end;
break;//别忘记跳出循环
end;
write(u,‘/‘,d);//输出结果
end.

嘿嘿嘿,其实在guide上调试完成后提交,结果发现一次性通过,感动得那是……

【哎呀~码字码的好幸苦……如果对你有帮助的话,麻烦在下面咩个声呗……谢谢

时间: 2024-12-25 19:44:12

【1083】code[vs] 1083 Cantor表 1999年NOIP全国联赛普及组的相关文章

旅行家的预算 1999年NOIP全国联赛普及组NOIP全国联赛提高组

时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,--N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出"No Solution". 输入描述 Input Descri

code vs 1094 FBI树 2004年NOIP全国联赛普及组

题目描述 Description 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树[1],它的结点类型也包括F结点,B结点和I结点三种.由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下: 1) T的根结点为R,其类型与串S的类型相同: 2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2:由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2.

棋盘型动态规划 之 CODE[VS] 1010 过河卒 2002年NOIP全国联赛普及组

/* dp[i][j] := 从起点[0][0]到坐标为[i][j]的位置,路径的条数. 卒行走规则:可以向下.或者向右,故 dp[i][j] = dp[i-1][j] + dp[i][j-1] (向下)      (向右) 注意: 去掉对方马的控制点 附: codevs测试数据有些弱,可以考虑到这里评测一下:清橙 (主要区别在于,dp[][]数据类型设为long long) */ 1 #include <iostream> 2 #include <cstdlib> 3 #incl

codevs 1044 拦截导弹 1999年NOIP全国联赛提高组

1044 拦截导弹 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 输入描述 Input Description 输入导弹

贪心 + 并查集 之 CODE[VS] 1069 关押罪犯 2010年NOIP全国联赛提高组

/* 贪心 + 并查集 之 CODE[VS] 1069 关押罪犯  2010年NOIP全国联赛提高组 两座监狱,M组罪犯冲突,目标:第一个冲突事件的影响力最小. 依据冲突大小,将M组罪犯按从大到小排序,按照排序结果,依次把每组罪犯分开放入两个监狱, 直到当前这组罪犯已经在同一个监狱中了,此时即为答案. 实现: 1)通过不在同一个监狱的罪犯,推断出在同一个监狱的罪犯.(依据:一共就两个监狱)      ftr[b] = a+n   // a和b是在不同监狱 ftr[c] = a+n   // a和

棋盘型动态规划 之 CODE[VS] 1169 传纸条 2008年NOIP全国联赛提高组

/* 这道题要解决两个问题 1)状态和状态方程 2)怎么保证每走一步,所形成的路径不相交,以保证最后生成的完整路径不相交. (1)状态: dp[i][j][k][l] = 小渊传递的纸条到[i][j]的位置,小轩传递的纸条到[k][l]的位置时,好心程度和的最大值. (2)状态方程: 看到题目,直接的想法是: 按题意,小渊从左上角->右下角,小轩从右下角->左上角.但是,路径在走的时候,怎么才能保证路径不相交,我想不出来办法了... 仔细想,题目要求: 两条路径的头尾坐标相同(出发点选择不同)

CODE[VS] 1098 均分纸牌 ( 2002年NOIP全国联赛提高组)

arr[i] :表示每个牌堆的纸牌的数目 平均值 :当纸牌数都一样多时,纸牌的数目 从左向右考虑,每堆纸牌有三种状态: 1) arr[i] == 平均值,考虑arr[i+1] 2) arr[i] < 平均值,此时由arr[i+1]移给arr[i]纸牌. => 移动纸牌数:(平均值 - arr[i])张    注:   考虑此时,arr[i]缺牌,那么i右边的牌堆必然多牌,无论哪堆多牌,必然有由arr[i+1]将牌移给arr[i]的过程. 3) arr[i] > 平均值,此时由arr[i]

划分型动态规划 之 CODE[VS] 1040 统计单词个数 2001年NOIP全国联赛提高组

/* dp[i][k] := 前i+1个字符组成的字符串,划分为k份,每份中包含的单词个数加起来总数的最大值. 初始化: dp[][] = -0x3f3f3f3f   // 注意:对于dp[i][k],若(i+1)<k,则dp[i][k]的值不存在,设为-0x3f3f3f3f.例如:dp[0][2] = -0x3f3f3f3f  dp[i][1] = val[0][i]   //注:val[i][j] := 截取原字符串[从i到j的字符(包含i和j位置的字符)]组成字符串,返回其包含的单词个数

划分型动态规划 之 CODE[VS] 1039 数的划分 2001年NOIP全国联赛提高组

/* dp[i][k] := 将整数i分成k份,分法种数 初始化: dp[][] = { 0 } dp[i][1] = 1 状态方程: dp[i][k] = dp[i-1][k-1] + dp[i-k][k] 思想:(引自byvoid大神的博客:https://www.byvoid.com/blog/noip-allsolutions#.E6.95.B0.E7.9A.84.E5.88.92.E5.88.86) 每种拆分方案中,最小的数为w,按照w的不同,我们可以把拆分方案分成2类: w=1,我们