洛谷P1563玩具谜题

1. 题目描述

有 n个玩具小人围成一圈, 已知它们的职业和朝向。现在第1个玩具小人告诉小南一个包含m条指令的谜題, 其中第 z条指令形如“左数/右数第s,个玩具小人”。 你需要输出依次数完这些指令后,到达的玩具小人的职业。

详细题目描述见原题地址

2. Notes

  1. 如果两个要存储的量一直要绑定在一起,可以考虑用结构体,如本题中的朝向移动步数,数据处理起来更简单。

  2. cin忽略空格,回车等空白字符。

  3. 写OJ时一个通用的头文件

    1
    #include<bits/stdc++.h>

    包含所有的标准库,不用再操心头文件的事情。

  4. 围成一圈,无论题目转的条件怎么花里胡哨,也就是只有两种情况,一种是顺时针,一种是逆时针。因此只需找到顺时针的条件或逆时针的条件即可,另一个else即可。如题解中的nd[tmp].f==p

  5. 取余是为了在圈内,但是只有一个方向可以用,另一个方向要用总数去减,因为在C++中负数取余是负数,就出圈了。

3. 题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<bits/stdc++.h>
using namespace std;

struct node{
bool f;
string name;
};

int main(){
struct node nd[100003];
int n,m,i,j,tmp,p,q;
cin>>n>>m;
for(i=0;i<n;i++){
cin>>nd[i].f>>nd[i].name;
}

tmp=0;
for(j=0;j<m;j++){
cin>>p>>q;
if(nd[tmp].f==p){ //逆时针
tmp = (tmp+n-q)%n;
}else{ //顺时针
tmp = (tmp+q)%n;
}
}
cout<<nd[tmp].name;
return 0;
}