每日一题(P1563 [NOIP 2016 提高组] 玩具谜题)(第1天)

📅 发布时间:2026/7/5 11:43:43 👁️ 浏览次数:
每日一题(P1563 [NOIP 2016 提高组] 玩具谜题)(第1天)
每日一题P1563 [NOIP 2016 提高组] 玩具谜题第1天P1563 [NOIP 2016 提高组] 玩具谜题题目背景NOIP2016 提高组 D1T1题目描述小南有一套可爱的玩具小人它们各有不同的职业。有一天这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈它们有的面朝圈内有的面朝圈外。如下图这时 singer 告诉小南一个谜题“眼镜藏在我左数第333个玩具小人的右数第111个玩具小人的左数第222个玩具小人那里。”小南发现这个谜题中玩具小人的朝向非常关键因为朝内和朝外的玩具小人的左右方向是相反的面朝圈内的玩具小人它的左边是顺时针方向右边是逆时针方向而面向圈外的玩具小人它的左边是逆时针方向右边是顺时针方向。小南一边艰难地辨认着玩具小人一边数着:singer 朝内左数第333个是 archer。archer 朝外右数第111个是 thinker。thinker 朝外左数第222个是 writer。所以眼镜藏在 writer 这里虽然成功找回了眼镜但小南并没有放心。如果下次有更多的玩具小人藏他的眼镜或是谜题的长度更长他可能就无法找到眼镜了。所以小南希望你写程序帮他解决类似的谜题。这样的谜题具体可以描述为有nnn个玩具小人围成一圈已知它们的职业和朝向。现在第111个玩具小人告诉小南一个包含mmm条指令的谜题其中第zzz条指令形如“向左数/右数第sss个玩具小人”。你需要输出依次数完这些指令后到达的玩具小人的职业。输入格式输入的第一行包含两个正整数n,mn,mn,m表示玩具小人的个数和指令的条数。接下来nnn行每行包含一个整数和一个字符串以逆时针为顺序给出每个玩具小人的朝向和职业。其中000表示朝向圈内111表示朝向圈外。保证不会出现其他的数。字符串长度不超过101010且仅由英文字母构成字符串不为空并且字符串两两不同。整数和字符串之间用一个空格隔开。接下来mmm行其中第iii行包含两个整数ai,sia_i,s_iai​,si​表示第iii条指令。若ai0a_i0ai​0表示向左数sis_isi​个人若ai1a_i1ai​1表示向右数sis_isi​个人。 保证aia_iai​不会出现其他的数1≤sin1 \le s_i n1≤si​n。输出格式输出一个字符串表示从第一个读入的小人开始依次数完mmm条指令后到达的小人的职业。输入输出样例 #1输入 #17 3 0 singer 0 reader 0 mengbier 1 thinker 1 archer 0 writer 1 mogician 0 3 1 1 0 2输出 #1writer输入输出样例 #2输入 #210 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输出 #2y说明/提示样例 1 说明这组数据就是【题目描述】中提到的例子。子任务子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难可以尝试只解决一部分测试数据。每个测试点的数据规模及特点如下表:::cute-table{tuack}测试点nnnmmm全朝内全左数si1s_i1si​1职业长度为111111202020100010001000√\surd√√\surd√√\surd√√\surd√222^^×\times×^^^333^^√\surd√×\times×^^444^^×\times×^^^555^^√\surd√√\surd√×\times×^666^^×\times×^^^777^^√\surd√×\times×^^888^^×\times×^^^999^^√\surd√√\surd√√\surd√×\times×101010^^×\times×^^^111111^^√\surd√×\times×^^121212^^×\times×^^^131313^^√\surd√√\surd√×\times×^141414^^×\times×^^^151515^^√\surd√×\times×^^161616^^×\times×^^^17171710510^510510510^5105√\surd√√\surd√^^181818^^×\times×^^^191919^^√\surd√×\times×^^202020^^×\times×^^^其中一些简写的列意义如下:全朝内若为√\surd√表示该测试点保证所有的玩具小人都朝向圈内全左数若为√\surd√表示该测试点保证所有的指令都向左数即对任意的1≤z≤m,ai01\leq z\leq m, a_i01≤z≤m,ai​0s1s1s1若为√\surd√表示该测试点保证所有的指令都只数111个即对任意的1≤z≤m,si11\leq z\leq m,s_i11≤z≤m,si​1职业长度为111若为√\surd√表示该测试点保证所有玩具小人的职业一定是一个长度为111的字符串。今天不码字让我们来看看AI的实力那么我们已经将问题喂给AI了让我们看看AI的回答看题目描述这是一个模拟题。有 n 个玩具小人围成一圈每个有朝向0向内1向外和职业。从第一个小人开始根据 m 条指令0向左数1向右数移动最后输出所在位置的职业。关键点是朝内的小人左边是顺时针编号减 1右边是逆时针编号加 1朝外的小人左边是逆时针编号加 1右边是顺时针编号减 1结合指令的左右就能确定编号是增加还是减少我们可以用取模来循环处理。思路分析设当前在位置pos0-based 索引当前小人的朝向为dir0 向内1 向外。指令a0表示向左数a1表示向右数但左右和朝向有关所以实际上如果dir 0朝内向左数 → 顺时针 → 编号减 1向右数 → 逆时针 → 编号加 1如果dir 1朝外向左数 → 逆时针 → 编号加 1向右数 → 顺时针 → 编号减 1于是当dir a时朝内且左数或朝外且右数编号变化为-s当dir ! a时朝内且右数或朝外且左数编号变化为s然后取模n保证循环。代码实现#includeiostream#includevector#includestringusingnamespacestd;intmain(){intn,m;cinnm;vectorintdir(n);vectorstringjob(n);for(inti0;in;i){cindir[i]job[i];}intpos0;// 当前索引0-basedfor(inti0;im;i){inta,s;cinas;if(dir[pos]a){// 方向相同 → 顺时针移动pos(pos-s)%n;}else{// 方向不同 → 逆时针移动pos(poss)%n;}// 处理负数取模if(pos0)posn;}coutjob[pos]endl;return0;}所以说要运用科技的力量我与AI的思路稍微不同多了好几个判断主要代码是这样if(a[now].fang0x0){now(nown-y)%n;}elseif(a[now].fang0x1){now(nowy)%n;}elseif(a[now].fang1x0){now(nowy)%n;}elseif(a[now].fang1x1){now(nown-y)%n;}AI是这样if(dir[pos]a){// 方向相同 → 顺时针移动pos(pos-s)%n;}else{// 方向不同 → 逆时针移动pos(poss)%n;}// 处理负数取模if(pos0)posn;}//可能我粘过来时有点问题所以说还是要贴上我的代码的大家做题时也可以用一下AI但请不要直接把代码粘过去AC 代码#includebits/stdc.husingnamespacestd;intn,m;intx,y;structtoy{intfang;string name;}a[1000001];intmain(){cinnm;for(inti0;in;i){cina[i].fanga[i].name;}intnow;for(inti1;im;i){cinxy;if(a[now].fang0x0){now(nown-y)%n;}elseif(a[now].fang0x1){now(nowy)%n;}elseif(a[now].fang1x0){now(nowy)%n;}elseif(a[now].fang1x1){now(nown-y)%n;}}couta[now].nameendl;return0;}就这样完结撒花✿✿拜了个拜