#include <iostream>
#include <string>
using namespace std;
string a[100010][2];
int b[100010][2];
/*
此题可以直接将这个循环圈看做一个竖着的一维数组,然后步数就是在这数组里面循环走,很像约瑟夫问题
current 是指向当前走到的那个人的数组,flag与flag2是分别判断两种情况数组溢出的时候
*/
int main()
{
int n,m,flag2=0;
int current=0;
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i][0]>>a[i][1];
}
for(int j=0;j<m;j++)
{
cin>>b[j][0]>>b[j][1];
if((b[j][0]==0&&a[current][0]=="0")||(b[j][0]==1&&a[current][0]=="1"))
{//向上走
flag2=(b[j][1]%n);//当步数是n的倍数的时候,会重复好几轮,所以直接取余
if(current-flag2<0){//如果向上走的时候会发现会小于最小的那一个
current=n-1-(flag2-current-1);//换一个相减的方法,因为是一个头尾可循环的
}
else current=current-flag2;//如果不会溢出就相减
continue;
}
else if((b[j][0]==0&&a[current][0]=="1")||(b[j][0]==1&&a[current][0]=="0"))
{//向下走
if(current+b[j][1]>n-1)
{
int flag=(b[j][1]+n-1-current)/(n-1);
if (flag==0) flag=1;
current=(b[j][1]+current-(flag*(n-1))-1);
}
else current=current+b[j][1];
continue;
}
}
cout<<a[current][1]<<endl;
}
【算法练习】洛谷——算法1-1模拟与高精度 P1563 玩具谜题
最新推荐文章于 2024-02-11 08:24:24 发布