【NOIP2012普及】寻宝

2019-04-14 21:15发布

题解:

我用了一个三维数组来保存整座楼的数据,Tatemono[i][j][k]中i为楼层,j为
房间,k为房间的属性(1为是否有楼梯,2为指示牌上的数字),我还用
Tatemono[i][0][0]来保存该层楼的有楼梯的房间个数
然后开始每层楼模拟,注意在使用Step时,要模该层楼有楼梯的房间个数,
来减少循环次数,我第一次做的时候就是没有模导致后五个TLE了。
取模的时候也要注意,当模完等于0时,并不是说我们就不走了,还要加上一个有楼梯的房间个数
整个程序也保证每次跳出内部for循环时,下一次的开始是上一次跳出时的Hajime

代码:

#include #include #include #include #include #include #include #include #include #include #include #include #define MAXA 2000500 #define MOD 20123 using namespace std; typedef long long LL; int n,m; int Tatemono[10005][105][2];//[][][1]CanUp [][][2]Tip int Hajime,Kagi; int main() { //freopen("treasure.in","r",stdin); //freopen("treasure.out","w",stdout); scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { for(int j=0;j<=m-1;j++) { scanf("%d %d",&Tatemono[i][j][1],&Tatemono[i][j][2]); if(Tatemono[i][j][1]) Tatemono[i][0][0]++; } } scanf("%d",&Hajime); for(int i=1;i<=n;i++) { int Step = Tatemono[i][Hajime][2]; Kagi += Step; Step = Step % Tatemono[i][0][0]; if(Step == 0) Step += Tatemono[i][0][0]; for(Hajime;Hajime<=m;Hajime++) { if(Hajime == m) Hajime = 0; if(!Tatemono[i][Hajime][1]) continue; else Step--; if(Step == 0) break; } } printf("%d",Kagi%MOD); }