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

来源:互联网 发布:扁平化与金字塔 知乎 编辑:程序博客网 时间:2024/05/21 11:22

题目传送门
题意解析:题目就是给了你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; } 
原创粉丝点击