题目描述
m m m个小人围成了一个圈,每个小人有朝里朝外两个方向(所以左右不相同),从读到的第一个小人开始执行类似 “往左/右 x x x个人” 这样的指令, x x x保证不超过一圈,输出最后停下的位置
解答思路
- 用双向循环链表模拟这个圈,会超时
- 用数组取模,为便于书写可以把往左数和往右数统一,左数 x x x个小人等价于右数 m − x m-x m−x个小人
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
class Role{
public:
string name;
int dir;
Role() {}
Role(string n, int d):
name(n),
dir(d)
{}
};
int main(){
int m, n;
cin >> m >> n;
vector<Role> roles(m);
for (int i = 0; i < m; ++i){
cin >> roles[i].dir >> roles[i].name;
}
int index = 0;
while (n--){
int d, count;
cin >> d >> count;
if (!(d ^ roles[index].dir)) count = m - count;
index = (index + count) % m;
}
cout << roles[index].name << endl;
}