首页 > 其他分享 >洛谷之P1563 [NOIP2016 提高组] 玩具谜题

洛谷之P1563 [NOIP2016 提高组] 玩具谜题

时间:2024-03-24 17:33:47浏览次数:32  
标签:NOIP2016 洛谷 int P1563 玩具 else si 小人 first

题目

 [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

相关文章

  • 洛谷题单算法1-6二分查找与二分答案
    代码仅供参考,不足之处望理解。P2249【深基13.例1】查找#include<iostream>usingnamespacestd;constintN=1e6+5;intn,m,a[N];intmain(){ios::sync_with_stdio(false);//输入cin>>n>>m;for(inti=1;i<=n;i++)cin>>a[i];for(inti=1......
  • 洛谷P3498 [POI2010] KOR-Beads 题解
    P3498[POI2010]KOR-Beads对于数列${A_i}$,求$k$使数列被分为$\lfloor\frac{n}{k}\rfloor$个部分后不同子数列种类最多(子串翻转前后为一类子串)很容易想到:枚举$k\\in\[1,n]$,记录每个$k$下不同种类数,然后取最优即可,那么问题来了:如何计算种类数?暴戾算法:一种纯......
  • C语言:洛谷题目分享(4)小书童--凯撒密码和笨小猴
    目录1.前言2.俩道题目1.小书童--凯撒密码1.题目背景2.题目描述3.输入格式4.输出格式5.题解2.笨小猴1.题目描述2.输入格式3.输出格式4.题解3.小结1.前言哈喽大家好啊,今天我继续为大家分享洛谷题单的俩道题目,请大家多多支持喔~2.俩道题目1.小书童--凯撒密码......
  • 洛谷题单指南-集合-P1525 [NOIP2010 提高组] 关押罪犯
    原题链接:https://www.luogu.com.cn/problem/P1525题意解读:有很多罪犯,要关到两座监狱,有一些罪犯之间有仇,并且可以量化出仇恨值,如果关在一起就会冲突,造成的影响就是仇恨值,要使得造成的影响最小,如果可以完全不起冲突,输出0。解题思路:首先,要让冲突影响最小化,显然应该把仇恨大的罪犯......
  • 洛谷 P1379 八数码难题 A* 题解
    刚做完一道模板A*,看到这题我直接小脑萎缩了...阿米诺斯!这怎么用A*?!——刚开题的我beeeeeeeeeelike甚至比模板简单(这是绿的...)其实会是会但是纸张的是这玩意我不会搞估价函数我草!然后突然想到能不能把这个状态下有多少个数字不在目标位置作为估价函数?我喜欢\(IDA*\),有兴趣......
  • 洛谷-P2178 学习笔记
    题面[NOI2015]品酒大会题目描述一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。在大会的晚餐上,调酒师Rainbow调制了\(n\)杯鸡尾酒。这\(n\)杯鸡尾酒排成一......
  • 洛谷题单指南-集合-P1102 A-B 数对
    原题链接:https://www.luogu.com.cn/problem/P1102题意解读:前文https://www.cnblogs.com/jcwy/p/18043197介绍了二分和双指针的做法,本文介绍hash的做法。解题思路:定义map<int,int>h,保存每个数+c出现的个数同样,先将所有数由小到大哦排序遍历每一个数x,答案累加ans+=h[x]然......
  • 洛谷题单指南-集合-P5266 【深基17.例6】学籍管理
    原题链接:https://www.luogu.com.cn/problem/P5266题意解读:本题考察map的应用。解题思路:直接使用map即可解题。100分代码:#include<bits/stdc++.h>usingnamespacestd;map<string,int>h;stringname;intn,op,score;intmain(){cin>>n;while(n--)......
  • 洛谷题单指南-集合-P5250 【深基17.例5】木材仓库
    原题链接:https://www.luogu.com.cn/problem/P5250题意解读:根据题目要求,需要一种数据结构,支持去重、排序、logN的查找,set是最合适的。解题思路:先回顾一下set的关键操作:设set<int>s;1、添加:s.insert(x)2、查询个数:s.count(x)3、查找第一个>=x的元素,返回迭代器:set<int>::iter......
  • 洛谷题单指南-集合-P3370 【模板】字符串哈希
    原题链接:https://www.luogu.com.cn/problem/P3370题意解读:本题要求理解哈希的原理,自行建立哈希表解题,如果直接使用map,就不推荐。解题思路:先介绍哈希的原理1、什么是哈希?什么是哈希表?先从一个问题出发:给定不超过105个整数(取值1~109),要统计不重复整数的数量。首先,如果取值范围......