C++题解 P1525 Cantor表
原题: 1525.Cantor表2023zjhs020 于2025-02-06
吐槽一下:
本题其实十分简单,结果被评定为普及/提高-,还只有一篇题解。(我这个蒻赶紧来写一篇了)
(原以为这是最短代码了,结果被学长无情打脸,呜呜呜)
好了不废话了。看解释
本题解释:
while循环,就是为了通过循环枚举,判断它在编号之后的第几行,第几个位置。
(这个优化有没有都可以AC本题,但是评论指出我的时间复杂度不够优秀,因此提一提这个优化,不愿意看的可以直接略过看下一个分割线以后的内容。)
但其实可以直接出结论优化时间复杂度从O(n)优化到O(1),这样就要考虑到等差数列求和。
所以,很显然Z字型排序之后,第k行的数编号n满足:
这样就可以把那个循环优化掉。代码就不贴了 (因为懒,还怕出错)
最后用k判断奇偶,是判断这一行
Z字型编号是正序(类似第二行)还是倒序(类似第三行)然后用最开始的结论输出原表中的行号除以列号就行了。
(本题的核心已解释,不懂得再好好想想)
#include <bits/stdc++.h>//头文件
using namespace std;
//long long n,k=1;//定义
int main() {cin>>n;//输入while(n>k)//循环{n=n-k;//不断减k++;//自增}if(k%2==0) cout<<n<<"/"<<(k+1-n);//是否是偶数else cout<<k+1-n<<"/"<<n;//不是return 0;//结束
}
(看懂了吗????)
(看懂了吗????)