[luogu-1563]noip2016day1-T1 玩具谜题 题解

9 篇文章 0 订阅
6 篇文章 0 订阅

题目传送门
题意解析:题目就是给了你n个人组成的一个环,然后从第一个人开始移动的方案,让你找出最后到达的位置。


My opinion:看到题就知道是模拟,明显。(当然也是我noip唯一会做的题)这只不过是怎么来的问题罢了。

总结:
直接模拟便可。有一种简洁的方式不用这么多的if语句。
你可以发现如果一个人朝向是向外的,他的左右是相反的(废话,题目里都说了)
所以左右和朝向分别用0,1表示,如果左右和朝向的异或值决定了真实方向。


代码长是因为头文件:

#include<iostream> 
#include<cstdio> 
#include<cmath> 
#include<cstring> 
#include<algorithm> 
#include<queue> 
#define rep(i,a,n) for (int i=a;i<=n;i++) 
#define per(i,a,n) for (int i=a;i>=n;i--) 
#define Clear(a,x) memset(a,x,sizeof(a)) 
#define ll long long 
#define INF 2000000000 
#define eps 1e-8 
using namespace std; 
ll read(){ 
    ll x=0,f=1; 
    char ch=getchar(); 
    while (ch<'0'||ch>'9') f=ch=='-'?-1:f,ch=getchar(); 
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); 
    return x*f; 
} 
const int maxn=100005,maxlen=15; 
int n,m; 
char s[maxn][maxlen]; 
int p[maxn]; 
int calc(int now){ 
    if (now<=0) now+=n; 
    if (now>n) now-=n; 
    return now;  
} 
int main(){ 
    n=read(),m=read(); 
    rep(i,1,n){ 
        p[i]=read(); 
        scanf("%s",s[i]+1); 
    } 
    int now=1; 
    rep(i,1,m){ 
        int a=read(),l=read(); 
        if (p[now]^a==0) now=calc(now-l); 
            else now=calc(now+l); 
    } 
    cout<<s[now]+1<<endl; 
    return 0; 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值