洛谷P1563

看完了noip2017觉得noip2016是真的简单……2017第一题就卡住2016第一题10分钟AC

思路:

m<=100000很明显暴力模拟就可以

唯一有一点点难度的地方就是小人的朝向对位置的影响

写个函数用if else直接判断也可以但这里提供一个更简单的方法:将指令存储在数组中

题目给的信息是0表示朝向圈内,1表示朝向圈外,且0表示向左数,1表示向右数

直接用题目输入的逆时针环,我们可以推出,朝向和数的方向均为0或1时为-,朝向和数的方向不同时为+(这个很容易理解吧)

废话不多说先贴个代码:

 #include<iostream>
#include<string>
using namespace std;
int ord[][]={-,,,-};//存放指令
string job[];//职业存储
int face[];//小人朝向
int main()
{
int n,m;
cin>>n>>m;
for(int i=;i<n;i++)
cin>>face[i]>>job[i];
int place=;//位置标记
while(m--)
{
int a,s;
cin>>a>>s;
place+=ord[a][face[place]]*s;//操作
place%=n;
if(place<)
place+=n;
}
cout<<job[place]<<endl;
return ;
}

两点注意事项:

1、下标要从0开始(方便使用取模运算)

2、每次操作后要取模,但注意place<0的时候C++自带模运算的结果是<0的,此时只要+n就可以(博主亲自测试过,C++对于负数的模运算定义为其绝对值的模运算,结果的符号取决于被除数的符号(因为模是由整除定义来的:a%b=a-a/b(整除)))

05-11 22:05