1 条题解

  • 0
    @ 2025-8-24 22:23:13

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Halberd_Cease
    演唱会戒断中,勿搞

    搬运于2025-08-24 22:23:13,当前版本为作者最后更新于2021-07-20 11:09:13,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P6703 KOLO

    分析与解

    一道经典的模拟

    分析

    注意事项:

    1. 首先 轮中没有字母重复出现

    2. 然后 轮沿顺时针方向旋转;说明

    3. 最后 从最后一次旋转结束时的尖头字母开始,然后顺时针方向输出

    综上所述,我们总结出如下几点:

    1. 如果有同一个字母在不同位置出现即不成立

    2. 如果同一位置有不同字母出现即不成立

    3. 指针沿逆时针转动,而需要顺时针输出

    步骤一:读入+不成立判断

    没有必要详解,附代码:

    
    	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
    上传者