NOIP 普及组 2012 寻宝(思维???)

传送门

https://www.cnblogs.com/violet-acmer/p/9937201.html

题解:

  一开始用暴力查找下一个要去的房间,超时了,emmmmm.......

  然后,就稍微优化了一下,具体看代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MOD=20123;
 4 const int maxn=1e4+50;
 5 
 6 int N,M;
 7 int pos;//当前位置
 8 int id[110];//存储每一层 pos 房间之后的 key==1 的房间编号
 9 struct Node
10 {
11     int key;//0 表示没有,1 表示有
12     int index;//指示牌上的数 字
13     Node(int a=0,int b=0):key(a),index(b){};
14 }Floor[maxn][110];
15 
16 int nextRoom(int nowF,int pos)
17 {
18     int x=0;
19     int p=pos;
20     do
21     {
22         if(Floor[nowF][p].key == 1)
23             id[++x]=p;//按照逆时针顺序,将key == 1的房间编号加入到id[]中
24         p=(p+1 == M ? 0:p+1);
25     }while(p != pos);
26 
27     int mod=Floor[nowF][pos].index%x;//id[mod]即为所求的房间
28     return mod == 0 ? id[x]:id[mod];//特别注意,当mod == 0时,所求房间为 id[x]
29 }
30 void Solve()
31 {
32     int nowF=1;
33     int sum=0;
34     while(nowF <= N)
35     {
36         sum=sum%MOD+Floor[nowF][pos].index;//根据题意求解密钥
37         pos=nextRoom(nowF,pos);//查找下一个要去的房间
38         nowF++;
39     }
40     printf("%d\n",sum%MOD);
41 }
42 int main()
43 {
44     scanf("%d%d",&N,&M);
45     for(int i=1;i <= N;++i)
46     {
47         for(int j=0;j < M;++j)
48         {
49             int a,b;
50             scanf("%d%d",&a,&b);
51             Floor[i][j]=Node(a,b);
52         }
53     }
54     scanf("%d",&pos);
55     Solve();
56 }
View Code

  踩到一个坑:

    当 mod == 0 时,说明满足要求的房间为id[x]而不是id[0]

  

猜你喜欢

转载自www.cnblogs.com/violet-acmer/p/9937391.html