题目
[NOIP2016 提高组] 玩具谜题
题目背景
NOIP2016 提高组 D1T1
题目描述
小南有一套可爱的玩具小人,它们各有不同的职业。
有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:
这时 singer 告诉小南一个谜题:“眼镜藏在我左数第 $3$ 个玩具小人的右数第 1 个玩具小人的左数第 2 个玩具小人那里。”
小南发现,这个谜题中玩具小人的朝向非常关键,因为朝内和朝外的玩具小人的左右方向是相反的:面朝圈内的玩具小人,它的左边是顺时针方向,右边是逆时针方向;而面向圈外的玩具小人,它的左边是逆时针方向,右边是顺时针方向。
小南一边艰难地辨认着玩具小人,一边数着:
singer 朝内,左数第 3 个是 archer。
archer 朝外,右数第 1个是 thinker。
thinker 朝外,左数第2 个是 writer。
所以眼镜藏在 writer 这里!
虽然成功找回了眼镜,但小南并没有放心。如果下次有更多的玩具小人藏他的眼镜,或是谜题的长度更长,他可能就无法找到眼镜了。所以小南希望你写程序帮他解决类似的谜题。这样的谜題具体可以描述为:
有 n个玩具小人围成一圈,已知它们的职业和朝向。现在第 1个玩具小人告诉小南一个包含 $m$ 条指令的谜題,其中第 $z$ 条指令形如“向左数/右数第 s 个玩具小人”。你需要输出依次数完这些指令后,到达的玩具小人的职业。
输入格式
输入的第一行包含两个正整数 n,m,表示玩具小人的个数和指令的条数。
接下来 n 行,每行包含一个整数和一个字符串,以逆时针为顺序给出每个玩具小人的朝向和职业。其中 0表示朝向圈内,1 表示朝向圈外。保证不会出现其他的数。字符串长度不超过 10 且仅由英文字母构成,字符串不为空,并且字符串两两不同。整数和字符串之间用一个空格隔开。
接下来 m 行,其中第 i 行包含两个整数 a_i,s_i,表示第 i 条指令。若 a_i=0,表示向左数s_i个人;若 a_i=1,表示向右数 s_i 个人。 保证 a_i 不会出现其他的数,1 <s_i < n。
输出格式
输出一个字符串,表示从第一个读入的小人开始,依次数完 $m$ 条指令后到达的小人的职业。
提示
子任务
子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解决一部分测试数据。
每个测试点的数据规模及特点如下表:
题解
分析
首先是一群小人逆时针按顺序站成一圈,有朝内的,也有朝外的,因此牵扯到各自的左右不同
倘若以朝内为主线,也就是把朝内的左右看作原本的量,那么朝外的就是对应取反
朝内 (0),朝外(1)
对于原本的量,0代表左,1代表右
对于取反的量,1代表左,0代表右
那就将朝外的小人的方向转化成朝内的小人的方向,参考系不同,方向便不同了,也就是说把朝内的人作为主参考系!
其次是输入部分,一组数据有朝向和名称两个量(多量),为使其一一对应,便使用到结构体!
之后要处理的便是,一群小人围成的是一个圈
如果移动的位置超出了总数怎么办?
假设每时每刻的位置下标记为x,总数记为n,若此刻的指令,使得x=n+1,又该如何处理呢?
这时候就要用到取余(mod)
使得x=x%(n)即可x%的数字取决于你的初始下标,此时我们取的x=初始下标为0,那么最大下标就是(n-1)。
一切就绪!上代码!
#include<iostream>
using namespace std;
struct pe //结构体people
{
char s[10];
int forth;
}peo[100000]; //设的大一点
int main()
{
int n,m;
int i,j;
int first=0; //第一个的下标为0;
cin>>n>>m;
int a[m],si[m];
for(i=0;i<n;i++)
cin>>peo[i].forth>>peo[i].s;
for(j=0;j<m;j++)
{
cin>>a[j]>>si[j];
if(peo[first].forth==0)
{
if(a[j]==0) // 主要的处理
{
if(first-si[j]>=0) //操作一
first=(first-si[j])%n;
else
first=(first-si[j])%n+n;
}
else //操作二
{
first=(first+si[j])%n;
}
}
else
{
if(a[j]==0) //朝向不同,故各自取反
{ //此处为操作2
first=(first+si[j])%n;
}
else //操作一
{
if(first-si[j]>=0)
first=(first-si[j])%n;
else
first=(first-si[j])%n+n;
}
}
}
cout<<peo[first].s<<endl; //输出即可
return 0;
但很容易发现
操作一与操作二分别用了两次,我们不妨定义函数来简化代码!
#include<iostream>
using namespace std;
int n,m; //设定全局变量
void ad1(int *p,int a) //操作1
{
if(*p-a>=0)
*p=(*p-a)%n;
else
*p=(*p-a)%n+n; //减去小于0以后再加上人数便可得
}
void ad2(int *p,int a) //操作2
{
*p=(*p+a)%n;
}
struct pe
{
char s[10];
int forth;
}peo[100000];
int main()
{
int i,j;
int first=0;
cin>>n>>m;
int a[m],si[m];
for(i=0;i<n;i++)
cin>>peo[i].forth>>peo[i].s;
for(j=0;j<m;j++)
{
cin>>a[j]>>si[j];
if(peo[first].forth==0) //简化后
{
if(a[j]==0)
ad1(&first,si[j]);
else
ad2(&first,si[j]);
}
else
{
if(a[j]==0)
ad2(&first,si[j]);
else
ad1(&first,si[j]);
}
}
cout<<peo[first].s<<endl;
return 0;
}
这就体现了函数的作用,可以一次修改重复操作,也能让代码更加简洁!
至此,本题结束!
路远常逢!
输入与输出
输入1
7 3 0 singer 0 reader 0 mengbier 1 thinker 1 archer 0 writer 1 mogician 0 3 1 1 0 2
输出1
writer
输入2
10 10 1 C 0 r 0 P 1 d 1 e 1 m 1 t 1 y 1 u 0 V 1 7 1 1 1 4 0 5 0 3 0 1 1 6 1 2 0 8 0 4
输出2
y
输入3
20 1000
0 bvxu
0 qsauefgdh
0 m
0 gp
0 pzfzchy
0 wzxiee
0 jhraza
0 vyqvcwfb
0 pqumj
0 tgxkp
0 rkexmpxma
0 cvizzvrhl
0 tcvvmgv
0 q
0 usyawims
0 yslzvg
0 aa
0 j
0 ysa
0 bfykfu
1 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
1 1
0 1
1 1
0 1
1 1
0 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
1 1
0 1
1 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
1 1
0 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
1 1
0 1
1 1
1 1
1 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
0 1
1 1
1 1
0 1
1 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
1 1
0 1
1 1
1 1
0 1
0 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
0 1
0 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
1 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
1 1
1 1
1 1
0 1
0 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
1 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
0 1
0 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
0 1
1 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
1 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
0 1
1 1
0 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
1 1
0 1
0 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
0 1
1 1
1 1
1 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
1 1
1 1
0 1
1 1
1 1
1 1
1 1
0 1
0 1
1 1
1 1
1 1
0 1
1 1
1 1
1 1
0 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
1 1
1 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
1 1
0 1
1 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
0 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
1 1
1 1
0 1
1 1
0 1
0 1
1 1
1 1
1 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
1 1
0 1
1 1
1 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
0 1
1 1
1 1
1 1
0 1
1 1
1 1
1 1
1 1
0 1
1 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
0 1
1 1
0 1
1 1
0 1
0 1
0 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
1 1
0 1
1 1
1 1
1 1
0 1
1 1
0 1
1 1
0 1
1 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
0 1
0 1
0 1
1 1
0 1
0 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
1 1
0 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
0 1
0 1
0 1
0 1
1 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
1 1
0 1
0 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
1 1
0 1
1 1
1 1
1 1
1 1
1 1
0 1
0 1
1 1
1 1
1 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
1 1
1 1
1 1
0 1
1 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
0 1
1 1
0 1
1 1
1 1
0 1
1 1
0 1
1 1
1 1
0 1
1 1
1 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
1 1
1 1
1 1
1 1
0 1
1 1
1 1
0 1
1 1
1 1
0 1
0 1
0 1
0 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
1 1
1 1
0 1
1 1
0 1
0 1
0 1
1 1
0 1
1 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
1 1
1 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
1 1
1 1
0 1
1 1
0 1
0 1
1 1
0 1
0 1
1 1
0 1
0 1
0 1
1 1
1 1
1 1
0 1
1 1
1 1
1 1
0 1
0 1
0 1
1 1
1 1
1 1
0 1
0 1
1 1
1 1
0 1
0 1
0 1
1 1
1 1
0 1
1 1
1 1
1 1
0 1
输出3
rkexmpxma
标签:NOIP2016,洛谷,int,P1563,玩具,else,si,小人,first From: https://blog.csdn.net/2302_81099523/article/details/136990223