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

Halberd_Cease
演唱会戒断中,勿搞搬运于
2025-08-24 22:23:13,当前版本为作者最后更新于2021-07-20 11:09:13,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
分析与解
一道经典的模拟
分析
注意事项:
-
首先 轮中没有字母重复出现;
-
然后 轮沿顺时针方向旋转;说明
-
最后 从最后一次旋转结束时的尖头字母开始,然后顺时针方向输出;
综上所述,我们总结出如下几点:
-
如果有同一个字母在不同位置出现即不成立
-
如果同一位置有不同字母出现即不成立
-
指针沿逆时针转动,而需要顺时针输出
解
步骤一:读入+不成立判断
没有必要详解,附代码:
cin>>n>>k; for(i=1;i<=k;i++) { cin>>s>>c; x=(x+s)%n;//指针更新 if(ans[x]!=0&&int(c)!=ans[x]||f[c]&&ans[x]!=int(c)) /*不成立条件: 1.该位置有不同字母 2.该字母已出现且不在当前位置 */ { cout<<'!';return 0;//判断不成立,结束 } ans[x]=int(c);//设置 f[c]=1;//已使用 }步骤二:输出
由题意可得:由指针x开始反序输出, 所以说,要分两段输出
如果
ans[i]没有值(没有赋值)那么输出?附代码:
for(i=x;i>=0;i--) if(ans[i]!=0)cout<<char(ans[i]);//第一段 else cout<<'?'; for(i=n-1;i>=x+1;i--) if(ans[i]!=0)cout<<char(ans[i]);//第二段 else cout<<'?';完整代码
快看!
#include<bits/stdc++.h> using namespace std; char c; int f[128],ans[26],s/*改变次数*/,k/*转向次数*/,i,j,n/*转子数*/,x/*指针*/; int main() { cin>>n>>k; for(i=1;i<=k;i++) { cin>>s>>c; x=(x+s)%n; if(ans[x]!=0&&int(c)!=ans[x]||f[c]&&ans[x]!=int(c)) { cout<<'!';return 0; } ans[x]=int(c); f[c]=1; } for(i=x;i>=0;i--) if(ans[i]!=0)cout<<char(ans[i]); else cout<<'?'; for(i=n-1;i>=x+1;i--) if(ans[i]!=0)cout<<char(ans[i]); else cout<<'?'; return 0; } -
- 1
信息
- ID
- 5711
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者