【題目描述】 小南有一套可愛的玩具小人,它們各有不同的職業。有一天,這些玩具小人把小南的眼鏡藏了起來。小南發現玩具小人們圍成了一個圈,它們有的面朝國內,有的面朝圈外。如下圖: 這時singer告訴小南一個謎題:“眼鏡藏在我左數第3個玩具小人的右數第1個玩具小人的左數第2個玩具小人那裡。” 小南發現, ...
【題目描述】
小南有一套可愛的玩具小人,它們各有不同的職業。有一天,這些玩具小人把小南的眼鏡藏了起來。小南發現玩具小人們圍成了一個圈,它們有的面朝國內,有的面朝圈外。如下圖:
這時singer告訴小南一個謎題:“眼鏡藏在我左數第3個玩具小人的右數第1個玩具小人的左數第2個玩具小人那裡。”
小南發現,這個謎題中玩具小人的朝向非常關鍵,因為朝內和朝外的玩具小人的左右方向是相反的:面朝圈內的玩具小人,它的左邊是順時針方向,右邊是逆時針方向;而面向圈外的玩具小人,它的左邊是逆時針方向,右邊是順時針方向。
小南一邊艱難地辨認著玩具小人,一邊數著:
“singer朝內,左數第3個是archer。
“archer朝外,右數第1個是thinker。
“thinker朝外,左數第2個是writer。
“所以眼鏡藏在writer這裡!”
雖然成功找回了眼鏡,但小南並沒有放心。如果下次有更多的玩具小人藏他的眼鏡,或是謎題的長度更長,他可能就無法找到眼鏡了。所以小南希望你寫程式幫他解決類似的謎題。這樣的謎題具體可以描述為:
有n個玩具小入圍成一圈,己知它們的職業和朝向。現在第1個玩具小人告訴小南一個包含m條指令的謎題,其中第i條指令形如“左數/右數第Si個玩具小人”。你需要輸出依次數完這些指令後,到達的玩具小人的職業。
【輸入格式】
從文件中讀入數據。
輸入的第一行包含兩個正整數n,m,表示玩具小人的個數和指令的條數。
接下來n行,每行包含一個整數和一個字元串,以逆時針為順序給出每個玩具小人的朝向和職業。其中0表示朝向圈內,1表示朝向圈外。保證不會出現其他的數。字元串長度不超過10且僅由小寫字母構成,字元串不為空,並且字元串兩兩不同。整數和字元串之間用一個空格隔開。
接下來m行,其中第i行包含兩個整數ai,Si,表示第i條指令。若ai=0,表示向左數Si個人;若ai=1,表示向右數Si個人。保證ai不會出現其他的數,1<si<n。
【輸出格式】
輸出到文件中。
輸出一個字元串,表示從第一個讀入的小人開始,依次數完m條指令後到達的小人的職業
【樣例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
【樣例1提示】
這組數據就是【題目描述】中提到的例子。
【樣例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
【提示】
子任務會給出部分測試數據的特點。如果你在解決題目中遇到了困難,可以嘗試只解決一部分測試數據。
每個測試點的數據規模及特點如下表:
其中一些簡寫的列意義如下:
·全朝內:若為“√”,表示該測試點保證所有的玩具小人都朝向圈內;
·全左數:若為“√”,表示該測試點保證所有的指令都向左數,即對任意的 1<i<m, ai=0;
·Si=1:若為“√”,表示該測試點保證所有的指令都只數1個,即對任意的 1≤i≤m, Si=1;
·職業長度為1:若為“√”,表示該測試點保證所有玩具小人的職業一定是一個 長度為1的字元串。
純模擬啊。。。。
要是今年的noip還出這樣的題就好了!
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 const int MAXN=100001; 7 int n,m,how,step; 8 struct node 9 { 10 string name; 11 int to; 12 }a[MAXN]; 13 int read(int &n) 14 { 15 char ch=' ';int q=0,w=1; 16 for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); 17 if(ch=='-')w=-1,ch=getchar(); 18 for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48; 19 n=q*w; return n; 20 } 21 int main() 22 { 23 //freopen("toya.in","r",stdin); 24 //freopen("toya.out","w",stdout); 25 read(n);read(m); 26 //scanf("%d%d",&n,&m); 27 //ios::sync_with_stdio(false); 28 for(int i=1;i<=n;++i) 29 { 30 read(a[i].to); 31 //scanf("%d",&a[i].to); 32 //cout<<a[i].to<<"*************"<<endl; 33 // 0朝向圈內 1朝向圈外 34 cin>>a[i].name; 35 } 36 int where=1; 37 for(int i=1;i<=m;++i) 38 { 39 read(how);read(step); 40 //scanf("%d%d",&how,&step); 41 // 0向左數,1向右數 42 if(how==0) 43 { 44 if(a[where].to==0)// 向內 45 { 46 where=where-step; 47 if(where<=0) 48 where=where+n; 49 } 50 else if(a[where].to==1)// 向外 51 { 52 where=where+step; 53 if(where>n) 54 where=where-n; 55 } 56 } 57 else// 向右數 58 { 59 if(a[where].to==0) 60 { 61 where=where+step; 62 if(where>n) 63 where=where-n; 64 } 65 else 66 { 67 where=where-step; 68 if(where<=0) 69 where=where+n; 70 } 71 } 72 } 73 cout<<a[where].name; 74 return 0; 75 }