题目来源(洛谷站):传送门
想要ctj的人直接跳过下列内容
这道题作为一道提高组的题目,还是比较简单的。洛谷给出的难度为普及-。
首先我的第一个反应是用结构体模拟链表,每个结构体中包含名字、左边小人的编号、右边小人的编号以及朝外还是朝内。
结构体部分代码↓
struct node{
string name;
int left,right;
bool wn;
}a[100005];
然后就写下去就好了
但是其实,left和right完全是浪费,直接一个bool类型表示外内就好了,数一数就ok。
我不怕浪费空间,写那么烦我愿意,就想炫炫我的代码技巧
不!你要这样你就写吧。
这样其实是不行的。根据题意可以知道,它所求的是左边或者右边第几个,而不是几次操作。所以说如果这么做,left和right其实是个浪费,还不如不写的好。当然这只是蒟蒻个人的想法,大神们写出的代码蒟蒻不懂。
所以说结构体代码就这样就好了:
struct node{
string name;
bool wn;
}a[100005];
现在全局考虑基本完成了。我们还需要定义一个模拟指针,叫na(那),每次移动只需要修改na的值,并不需要沿着结构体一个一个爬上去。
终于到了ctjer们最期待的时刻:
#include<bits/stdc++.h>
using namespace std;
int n,m,c,na;
bool zy;
struct node{
string name;
bool wn;
}a[100005];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i].wn>>a[i].name;
na=1;
while(m--){
cin>>zy>>c;
if(zy==0){
if(a[na].wn==0){
na-=c;
while(na<1)na+=n;
}else{
na+=c;
while(na>n)na-=n;
}
}else{
if(a[na].wn==1){
na-=c;
while(na<1)na+=n;
}else{
na+=c;
while(na>n)na-=n;
}
}
}
cout<<a[na].name;
return 0;
}
有些大神并不需要那么多ifelse,可以去看看洛谷中一些人的题解。建议不要抄,否则历史AC记录全部离你而去……