凉脾的比赛补题

B - Game of Throwns

 Kattis - throwns 

这道题目理解起来简单,但上手就会发现有很多小细节,如果疏忽,将导致错误。细节之一:学生的编号是0至n-1,而非1至n。

容易处理的细节:判断输入的是数字还是undo,可以直接判断输入的字符串的第一个字符是否为‘u’。若不是,则为数字。反之,则为undo。

也可以用一个函数——isdigit(string[0]),来判断输入的字符串的第一个字符是否为数字,从而判断输入的是数字还是undo。

不好处理的细节:如何将字符串转化为整形数字。这里就必须用到一个函数——stoi(string)。此函数能将输入的数字字符串转化为整形数字,既快速又简洁。

需要思维的地方:顺时针旋转和逆时针旋转后落位问题。

顺时针比较简单:转后位置=(当前位置+转数)%n。

逆时针则相对较难:首先求出转数对n求余后的数。然后把该数与当前位置数相比,若该数小于等于当前位置数,则转后位置=当前位置-该数。若该数大于当前位置数,则转后位置=当前位置+n-该数。

记录实际走的步数:若遇到undo则减去要减去的步数,否则++,就能很好应对undo的操作,最后输出实际最后一步的位置即可。

代码如下:

#include<iostream>
using namespace std;
char str[10];
int ans[110];
int main()
{
    int n,k;
    int shiji=0;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=k;i++)
    {
        cin>>str;
        if(isdigit(str[0])||str[0]=='-')
        {
            shiji++;
            int p=stoi(str);
            if(p>0) ans[shiji]=(ans[shiji-1]+p)%n;
            else 
            {
                int p2=-p%n;
                if(p2<=ans[shiji-1])
                ans[shiji]=ans[shiji-1]-p2;
                else 
                ans[shiji]=ans[shiji-1]+n-p2;
            }
        }
        else 
        {
            int undo;
            scanf("%d",&undo);
            shiji-=undo;
        }    
    }
    printf("%d",ans[shiji]);
return 0;
} 

 

posted @ 2020-02-01 17:55  John-C  阅读(95)  评论(0编辑  收藏  举报