UOJ260 【NOIP2016】玩具謎題


本文版權歸ljh2000和博客園共有,歡迎轉載,但須保留此聲明,並給出原文鏈接,謝謝合作。

 

 

 

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
轉載請注明出處,侵權必究,保留最終解釋權!

 

 

題目描述

小南有一套可愛的玩具小人,它們各有不同的職業。

有一天,這些玩具小人把小南的眼鏡藏了起來。小南發現玩具小人們圍成了一個圈,它們有的面朝圈內,有的面朝圈外。如下圖:

toy

這時 singer 告訴小南一個謎題:“眼鏡藏在我左數第 33 個玩具小人的右數第 11 個玩具小人的左數第 22 個玩具小人那里。”

小南發現,這個謎題中玩具小人的朝向非常關鍵,因為朝內和朝外的玩具小人的左右方向是相反的: 面朝圈內的玩具小人,它的左邊是順時針方向,右邊是逆時針方向;而面向圈外的玩具小人,它的左邊是逆時針方向,右邊是順時針方向。

小南一邊艱難地辨認着玩具小人,一邊數着:

singer 朝內,左數第 33 個是 archer

archer 朝外,右數第 11 個是 thinker

thinker 朝外,左數第 22 個是 writer

“所以眼鏡藏在 writer 這里!”

雖然成功找回了眼鏡,但小南並沒有放心。如果下次有更多的玩具小人藏他的眼鏡,或是謎題的長度更長,他可能就無法找到眼鏡了。 所以小南希望你寫程序幫他解決類似的謎題。這樣的謎題具體可以描述為:

有 nn 個玩具小人圍成一圈,已知它們的職業和朝向。現在第 11 個玩具小人告訴小南一個包含 mm 條指令的謎題,其中第 ii 條指令形如“左數/右數第 sisi 個玩具小人”。

你需要輸出依次數完這些指令后,到達的玩具小人的職業。

輸入格式

從標准輸入讀入數據。

輸入的第一行包含兩個正整數 n,mn,m,表示玩具小人的個數和指令的條數。

接下來 nn 行,每行包含一個整數和一個字符串,以逆時針為順序給出每個玩具小人的朝向和職業。其中 00 表示朝向圈內,11 表示朝向圈外。 保證不會出現其他的數。字符串長度不超過 1010 且僅由小寫字母構成,字符串不為空,並且字符串兩兩不同。整數和字符串之間用一個空格隔開。

接下來 mm 行,其中第 ii 行包含兩個整數 ai,siai,si,表示第 ii 條指令。若 ai=0ai=0,表示向左數 sisi 個人;若 ai=1ai=1,表示向右數 sisi 個人。 保證 aiai 不會出現其他的數,1si<n1≤si<n。

輸出格式

輸出到標准輸出。

輸出一個字符串,表示從第一個讀入的小人開始,依次數完 mm 條指令后到達的小人的職業。

樣例一

input

7 3
0 singer
0 reader
0 mengbier
1 thinker
1 archer
0 writer
1 mogician
0 3
1 1
0 2

output

writer

explanation

這組數據就是題目描述中提到的例子。

樣例二

input

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

output

y



正解:模擬
解題報告:
  將題目中的小人朝向和往左右走,看成一個0、1狀態,容易發現我們可以通過異或和取模來實現每一步是走向編號變大還是編號變小。

 注意事項:

        涉及到取模時,一定要注意對於n取模之后的值域是[0,n-1],所以最好是一開始就把下標改成從0開始,避免不必要的錯誤。




 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <cstdlib>
 7 #include <algorithm>
 8 #include <ctime>
 9 #include <set>
10 #include <vector>
11 #include <queue>
12 using namespace std;
13 const int MAXN = 100011;
14 int n,m,dir[MAXN];
15 char ch[MAXN][14];
16 
17 void work(){
18     scanf("%d%d",&n,&m);
19     for(int i=1;i<=n;i++) {
20         scanf("%d",&dir[i]);
21         scanf("%s",ch[i]);
22     }
23     int x,y,ljh; x=1;
24     while(m--) {
25         scanf("%d%d",&ljh,&y);
26         if(dir[x]==0) {
27             if(ljh==0) {
28                 x+=n; x-=y;
29                 if(x>n) x%=n;
30             }
31             else{
32                 x+=y;
33                 if(x>n) x%=n;
34             }
35         }
36         else{
37             if(ljh==0) {
38                 x+=y;
39                 if(x>n) x%=n;
40             }
41             else{
42                 x+=n; x-=y;
43                 if(x>n) x%=n;
44             }
45         }
46     }
47     printf("%s",ch[x]);
48 }
49 
50 int main()
51 {
52     work();
53     return 0;    
54 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM