NOIP2016 D1T1 玩具谜题

NOIP2016 D1T1 玩具谜题

洛谷题目链接:https://www.luogu.org/problemnew/show/P1563

看完了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(整除)))

猜你喜欢

转载自www.cnblogs.com/LiHaozhe/p/9499376.html