NOIP201605玩具谜题-解题报告

                                                                        2019-11-07       14:14         

Part 1原题:

小南有一套可爱的玩具小人,它们各有不同的职业。

有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。 如下图:

这时singer 告诉小南一个迷题:“眼镜藏在我左数第 3 个玩具小人的右数第 1 个玩具小人的左数第 2 个玩具小人里。 ”
小南发现,这个迷题中玩具小人的朝向非常关键,因为朝内和朝外的玩具小人的左右方向是相反的:面朝圈内的玩具小人,它的左边是顺时针方向,右边是逆时针方向;而面向圈外的玩具小人,它的左边是逆时针方向,右边是顺时针方向。
小南一边艰难地辨认着玩具小人,一边数着:

“singer 朝内,左数第 3 个是archer。

“archer 朝外,右数第 1 个是thinker。

“thinker 朝外,左数第 2 个是writer。

“所以眼镜藏在writer  这里! ”
虽然成功找回了眼镜,但小南并没有放心。 如果下次有更多的玩具小人藏他的眼镜,或是迷题的长度更长,他可能就无法找到眼镜了。 所以小南希望你写程序帮他解决类似的迷题。这样的迷题具体可以描述为:
有 n 个玩具小人围成一圈,己知它们的职业和朝向。 现在第 1 个玩具小人告诉小 南一个包含 m 条指令的迷题,其中第 i 条指令形如“左数/右数第 si 个玩具小人”。 你需要输出依次数完这些指令后,到达的玩具小人的职业。

Part 2:思路

这道题目的关键是小人的朝向。

如果这些方向你都处理好了,那么就能AC了。

下面先粘一个超时代码:

 #include<bits/stdc++.h>
 using namespace std;
 struct toy
 {
     int dir;
     ];
 }a[];
 int i,j;
 int now;
 int m,n;
 int init()
 {
     ,f=;
     char c=getchar();
     ')
     {
         ;
         c=getchar();
     }
     ')
     {
         x=x*+c-';
         c=getchar();
     }
     return x*f;
 }
 int main()
 {
     n=init();
     m=init();
     ;i<n;i++)
     {
         a[i].dir=init();
         scanf("%s",&a[i].name);
     }
     int x,y;
     now=;
     ;i<=m;i++)
     {
         x=init();
         y=init();
          && x==) now=(now+n-y)%n;
          && x==) now=(now+y)%n;
          && x==) now=(now+y)%n;
          && x==) now=(now+n-y)%n;
     }
     printf("%s",&a[now].name);
     ;
 }

这个代码之所以超时,是因为它的处理部分(line43-45)的处理效率过低,下面粘AC代码:

#include<bits/stdc++.h>//万能头文件,这里偷了个懒 : )
using namespace std;//对于bits/stdc++.h来说,这句话是必要的,但对于某些头文件比如stdio.h来说,这句话不能写
int main()//main函数
{
    int n,m;//n个小人,m条线索
    scanf("%d%d",&n,&m);//读入
    ];//这里的a[i]用来记录第i个小人的脸的朝向
    ][];//因为每个名字都是一个字符串,所以这里的b数组(串)要用二维的
    ;i<n;i++)//循环从1到n,循环输入每个小人
    {
        scanf("%d%s",&a[i],&b[i]);
    }
    ];//这里的c数组用来记录每条线索的的距离,例如 1 3中的3
    ;i<m;i++)//循环每条线索
    {
        int t;//定义临时变量t,用来记录这条线索的行驶方向
        cin>>t;//读入方向
        cin>>c[i];//读入这条线索的距离
        ) c[i]*=-;    //这里,如果方向是 ‘右’,则将它乘上-1,方便后面累加和统计
    }
    ;//定义位置变量(position),初始设为0
    ;i<m;i++)//循环每条线索进行处理
    {
        ) c[i]*=-;//如果小人方向是 ‘左’,则将它乘上-1,方便后面累计和统计
        pos+=c[i];//对于每个线索,如果他的方向是左,那他的距离已经乘上-1了, 所以直接加上
        ) pos-=n;//如果他的越界方式是过于大,所以应该减去n,其功效类似于%n
        ) pos+=n;//如果他的越界方式是过于小,所以应该加上n,其功效类似于%n
    }
    cout<<b[pos];//输出当前位置上的小人的名字。
    ;
}

注释已经写上了,各位自己可以看。

                             

NOIP201605玩具谜题-解题报告的更多相关文章

  1. UOJ260 【NOIP2016】玩具谜题

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  2. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  3. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  4. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  5. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  6. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  7. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  8. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  9. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

随机推荐

  1. Future类型的连锁的运用

    Future类型的连锁的运用: 洗脸 刷牙 吃早饭 看电视 出门 串行: import scala.concurrent.{Await, Future} import scala.util.{Fail ...

  2. Android中内存泄露与如何有效避免OOM总结

    一.关于OOM与内存泄露的概念 我们在Android开发过程中经常会遇到OOM的错误,这是因为我们在APP中没有考虑dalvik虚拟机内存消耗的问题. 1.什么是OOM OOM:即OutOfMemoe ...

  3. java中的char

    System.out.println("char二进制位数:" + Character.SIZE);//16 即2个字节 在c语言中,char类型占一个字节,而汉子占两个字节,所以 ...

  4. MyBatis详解 一篇就够啦

    第1章MyBatis框架配置文件详解 1.1 typeHandlers类型转换器 每当MyBatis 设置参数到PreparedStatement 或者从ResultSet 结果集中取得值时,就会使用 ...

  5. Executor线程池原理详解

    线程池 线程池的目的就是减少多线程创建的开销,减少资源的消耗,让系统更加的稳定.在web开发中,服务器会为了一个请求分配一个线程来处理,如果每次请求都创建一个线程,请求结束就销毁这个线程.那么在高并发 ...

  6. 原生js动态创建文本内容的几种方式

    1.通过CreateTextNode文本节点 首先创建该元素(元素节点),然后向一个已存在的元素追加该文本节点 <!DOCTYPE html> <html> <body& ...

  7. 致所有.Net者和有梦想的朋友们 - 共勉

    这篇文章很早就想写的了,主要是人到了一定的年纪,就想唠叨一些看法,认不认可不重要,重要的是生活给予你的酸甜苦辣,你都想一吐为快. 这里主要基于多年来自己的一个行业感受和以及生活感想,唠叨一下工作以及生 ...

  8. Coins POJ - 1742

    给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数. Input 多组数据,每组数据前两个数字为n,m.n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额,后n个数为相应每种硬币的个数 ...

  9. Android OkHttp + Retrofit 下载文件与进度监听

    本文链接 下载文件是一个比较常见的需求.给定一个url,我们可以使用URLConnection下载文件. 使用OkHttp也可以通过流来下载文件. 给OkHttp中添加拦截器,即可实现下载进度的监听功 ...

  10. 客户端 SOCKET 编程

    建立客户端的 Socket: 客户端应用程序首先也是调用 WSAStartup() 函数来初始化 Winsock 的动态连接库,然后同样 调用 socket() 来建立一个 TCP 或 UDP Soc ...