NOIP201202寻宝
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP201202寻宝相关的知识,希望对你有一定的参考价值。
补一道本来应该是昨天发的题。
试题描述
|
传说很遥远的藏宝楼顶层藏着诱人的宝藏。 小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书。 |
输入
|
第一行2个整数N和M,之间用一个空格隔开。N表示除了顶层外藏宝楼共N层楼,M表示除顶层外每层楼有M个房间。接下来N*M行,每行两个整数,之间用一个空格隔开,每行描述一个房间内的情况,其中第(i-1)*M+j 行表示第i层j-1号房间的情况(i=1,2,…,N;j=1,2,…,M)。第一个整数表示该房间是否有楼梯通往上一层(0表示没有,1表示有),第二个整数表示指示牌上的数字。注意,从j号房间的楼梯爬到上一层到达的房间一定也是j号房间。最后一行,一个整数,表示小明从藏宝楼底层的几号房间进入开始寻宝(注:房间编号从0开始)。
|
输出
|
输出只有一行,一个整数,表示打开宝箱的密钥,这个数可能会很大,请输出对20123取模的结果即可。
|
输入示例
|
2 3
1 2 0 3 1 4 0 1 1 5 1 2 1 |
输出示例
|
5
|
其他说明
|
【输入输出样例说明】
第一层: 0 号房间,有楼梯通往上层,指示牌上的数字是 2; 1 号房间,无楼梯通往上层,指示牌上的数字是 3; 2 号房间,有楼梯通往上层,指示牌上的数字是 4; 第二层: 0 号房间,无楼梯通往上层,指示牌上的数字是 1; 1 号房间,有楼梯通往上层,指示牌上的数字是 5; 2 号房间,有楼梯通往上层,指示牌上的数字是 2; 小明首先进入第一层(底层)的 1 号房间,记下指示牌上的数字为3,然后从这个房间开始, 沿逆时针方向选择第3个有楼梯的房间2号房间进入,上楼后到达第二层的2号房间,记下指示牌上的数字为2, 由于当前房间本身有楼梯通向上层,该房间作为第一个有楼梯的房间。因此,此时沿逆时针方向选择第2个有楼梯的房间即为1号房间,进入后上楼梯到达顶层。这时把上述记下的指示牌上的数字加起来,即3+2=5,所以打开宝箱的密钥就是5。 【数据范围】0<N≤10000,0<M≤100,0<x≤1,000,000。 |
这道题“很好玩儿”,但是如果看不懂题的话就肯定做不出来。所以主要是考察读题能力。还有就是想办法不要时间超限。
1 #include <iostream> 2 3 using namespace std; 4 int c[10010],a[10010][101],b[10001][101]; 5 int read() //输入模板 ,在本题中很重要 6 { 7 int x=0,f=1; 8 char ch=getchar(); 9 while(ch<‘0‘||ch>‘9‘) 10 { 11 if(ch==‘-‘) f=-1; 12 ch=getchar(); 13 } 14 while(ch>=‘0‘&&ch<=‘9‘) 15 { 16 x=x*10+ch-‘0‘; 17 ch=getchar(); 18 } 19 return x*f; 20 } 21 int main() 22 { 23 int i,j,n,m,t; 24 n=read();m=read(); 25 for(i=1;i<=n;i++) 26 { 27 for(j=0;j<m;j++) {a[i][j]=read();b[i][j]=read();if(a[i][j]==1) c[i]++;} //a数组表示当前房间有没有楼梯,b数组表示当前房间的指示牌 28 } 29 t=read(); 30 j=t; 31 int ans=0,temp=0; 32 for(i=1;i<=n;i++) 33 { 34 ans+=b[i][t];ans%=20123; 35 j=t; 36 temp=0; 37 if(b[i][t]%c[i]==0) b[i][t]=c[i]; //为了防止指示牌上是一个比m大很多倍的数,循环太多遍会超限 38 else b[i][t]=b[i][t]%c[i]; 39 if(a[i][t]==1) temp++; //如果起点有楼梯,要减去当前楼梯 40 // cout<<"ans"<<ans<<endl; 41 while(temp<b[i][t]) //找第二层的起始位置 42 { 43 j++; 44 if(j>=m) j=0; 45 if(a[i][j]==1) temp++; 46 } 47 t=j; 48 } 49 cout<<ans; 50 return 0; 51 }
以上是关于NOIP201202寻宝的主要内容,如果未能解决你的问题,请参考以下文章