1 条题解
-
0
自动搬运
来自洛谷,原作者为

xyx404
发接龙拉黑 | 新初三|蒟蒻| Link3 聚合页 link3.cc/xyx404 | 个人博客链接 xyx404.github.io搬运于
2025-08-24 22:56:49,当前版本为作者最后更新于2024-04-06 14:56:46,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
思路:
观察题目描述发现当 等于三时,一共分成了三行。
先看第一行,打乱前的第一第五第九个字符分别变成了打乱后的第一二三个字符,相邻两个字符之间原本相差 的两倍。
再看第二行,首行和尾行的间隔依旧不变,假设列数为 ,会有两种情况:
- 若当前数为第二行的奇数个字符的时候,下一个字符是 的两倍。
- 若当前数为第二行的偶数个字符的时候,下一个字符是 的两倍。
第 行与第一行是一样的。
再画个只有数字的图来验证我们的思路。

观察后我们可以发现,当 为三时,一共分成了三行,打乱前的一、五、九分别变成了打乱后的第一、二、三个数,相邻两个数之间相差四也就是 的两倍,第 行与第一行相同。再看第二行你会发现,首行和尾行的间隔不变假设列数为 ,当前数为第二行的第奇数个数的时候,下一个数字是 的两倍,若当前数为第二行的第偶数个数的时候,下一个数字是 的两倍。而且每一行的第一个数字就是这一行的行数。
与我们上面的思路相同,所以可以写成代码。
完整代码:
#include<bits/stdc++.h> using namespace std; string s; char ans[100080]/* 存答案 */; int han=0/* 第几行 */; int h,len,pd1,pd2/* 用来判断现在的位置的字符是奇数还是偶数 */; int check(){// 如思路 if(han==1||han==h)return pd1+(h-1)*2; else{ if(pd2%2==1)return pd1+(h-han)*2; else return pd1+2*(han-1); } } int main(){// 如思路 cin>>h; cin>>s; len=s.size(); s=" "+s; han=pd1=pd2=1; for(int i=1;i<=len;i++){ ans[pd1]=s[i]; pd1=check(); pd2++; if(pd1>len){ han++; pd1=han; pd2=1; } } for(int i=1;i<=len;i++)cout<<ans[i]; return 0; }
- 1
信息
- ID
- 10009
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者