其实这一道题不是很需要记录那么多的状态,不需要那么多的判断,你可以看看能不能看懂我的思路:
```cpp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
string names[MAXN];
int faces[MAXN];//1 为朝向圈外 0 为朝向圈内
int n, m, mod, type, order, now = 0;
//指令 0 是向左数,1 是向右数
int MOD(int n){
return (n % mod + mod) % mod;
}
int main(){
cin >> n >> m;
mod = n;
for(int i = 0; i <= n - 1; i ++){
cin >> faces[i] >> names[i];
if(faces[i] == 0) faces[i] = -1;
}
for(int i = 1; i <= m; i ++){
cin >> type >> order;
if(type == 1) type = -1;
else type = 1;
now = MOD(now + type * faces[now] * order);
}
cout << names[now] << endl;
return 0;
}
```
这个感觉就是有一点相反数,用负数表示反方向,那么负负得正。
by NPH_Zhao @ 2023-08-22 11:14:15
@[Lv_666](/user/920270)
by NPH_Zhao @ 2023-08-22 11:14:54
@[NPH_Zhao](/user/1059321) 谢谢了
by Lv_666 @ 2023-08-22 14:03:28
```
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct to {
int t;
string na;
} a[N];
struct in {
int d;
int l;
} b[N];
int m,n,k=1;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i].t>>a[i].na;
for(int i=1;i<=m;i++)cin>>b[i].d>>b[i].l;
for(int i=1;i<=m;i++){
if(a[k].t==1){
if(b[i].d==1)k-=b[i].l;
else k+=b[i].l;
}else{
if(b[i].d==1)k+=b[i].l;
else k-=b[i].l;
}
if(k>n)k-=n;
if(k<1)k+=n;
}
cout<<a[k].na<<endl;
return 0;
}
```
by unhappysheep @ 2023-08-22 14:51:01