NOIP2016 D1T1 玩具谜题
看完了noip2017觉得noip2016是真的简单……2017第一题就卡住2016第一题10分钟AC
思路:
m<=100000很明显暴力模拟就可以
唯一有一点点难度的地方就是小人的朝向对位置的影响
写个函数用if else直接判断也可以但这里提供一个更简单的方法:将指令存储在数组中
题目给的信息是0表示朝向圈内,1表示朝向圈外,且0表示向左数,1表示向右数
直接用题目输入的逆时针环,我们可以推出,朝向和数的方向均为0或1时为-,朝向和数的方向不同时为+(这个很容易理解吧)
废话不多说先贴个代码:
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int ord[2][2]={-1,1,1,-1};//存放指令 5 string job[100000];//职业存储 6 int face[100000];//小人朝向 7 int main() 8 { 9 int n,m; 10 cin>>n>>m; 11 for(int i=0;i<n;i++) 12 cin>>face[i]>>job[i]; 13 int place=0;//位置标记 14 while(m--) 15 { 16 int a,s; 17 cin>>a>>s; 18 place+=ord[a][face[place]]*s;//操作 19 place%=n; 20 if(place<0) 21 place+=n; 22 } 23 cout<<job[place]<<endl; 24 return 0; 25 }
两点注意事项:
1、下标要从0开始(方便使用取模运算)
2、每次操作后要取模,但注意place<0的时候C++自带模运算的结果是<0的,此时只要+n就可以(博主亲自测试过,C++对于负数的模运算定义为其绝对值的模运算,结果的符号取决于被除数的符号(因为模是由整除定义来的:a%b=a-a/b(整除)))