1. 程式人生 > >NOIP 普及組 2012 尋寶(思維???)

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]