题解:P1563 [NOIP2016 提高组] 玩具谜题

· · 题解

题意

依次给你 n 个围成一圈的人的内外方向及其名字,有 m 条信息。

1 号人数起,依次执行每条信息中按上一条信息结束的人的方向往左或右数 s_i 个人,左时方向 a_i=0,右时方向 a_i=1

输出执行完最后一条信息后数到的人的名字。

解题分析

明显应该使用 模拟 算法来模拟数人的过程。

根据每条信息给的数的方向,和小人的朝向,分如下四种情况:

顺时针时位数减 s_i,逆时针时位数加 s_i

溢出后检查并补一下 n 就可以了。

代码

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x;
    string s;
}man[100005];
int n,m,now=1,k,p;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>man[i].x>>man[i].s;
    for(int i=1;i<=m;i++){
        cin>>k>>p;
        if(!k)p=-p;
        if(man[now].x==1)p=-p;
        now+=p;
        if(now>n)now-=n;
        if(now<=0)now+=n;
    }
    cout<<man[now].s;
    return 0;
}