- 题意(原题,NOIP2017提高组Day1):
- n个人围成一圈,逆时针给出每个人的朝向与名字。
- 从第一个人开始,给出m个操作,表示在这个人的位置处向左/右走x个人的位置,求最终位置。
- n,m<=100000
- 思路:
- 暴力模拟,向外+向左=+x,向内+向右=+x,其余-x。每个操作((now+/-x)+n%n)即可。
- 代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
struct person
{
int cx;
char name[11];
person()
{
cx=0;
memset(name,0,sizeof(name));
}
}a[110000];
int main()
{
int n,m,now=0;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d %s",&a[i].cx,a[i].name);
while(m--)
{
int x,y,opt;
scanf("%d%d",&x,&y);
if(a[now].cx==1&&x==0)opt=1;
if(a[now].cx==1&&x==1)opt=-1;
if(a[now].cx==0&&x==0)opt=-1;
if(a[now].cx==0&&x==1)opt=1;
now=((now+y*opt)+n)%n;
}
printf("%s\n",a[now].name);
return 0;
}