凉脾的比赛补题
Posted cnxz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了凉脾的比赛补题相关的知识,希望对你有一定的参考价值。
B - Game of 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; }
以上是关于凉脾的比赛补题的主要内容,如果未能解决你的问题,请参考以下文章