题解:
– 简单的模拟题, 因为每层楼都是一个环,所以可以把需要找到第几个房间对整层楼的有楼梯的房间数取模,然后在输入时把所有有楼梯的房间保存下来,用lower_bound
直接查找,时间复杂度:O(nlogn)
– 具体原理请自行举个栗子,绝对没有错的。
代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
const int MAXN=10005;
int n,m,now;
struct hehe{
int shu[105];
int sum;
int f[105];
}Floor[MAXN];
long long ans;
int main(){
// freopen("treasure.in","r",stdin);
// freopen("treasure.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++){
int ti;
scanf("%d%d",&ti,&Floor[i].shu[j]);
if(ti){
Floor[i].f[Floor[i].sum]=j;
Floor[i].sum++;
}
}
cin>>now;
for(int i=1;i<=n;i++){
int step=Floor[i].shu[now];
ans+=step;
ans%=20123;
step%=Floor[i].sum;
int j=lower_bound(Floor[i].f,Floor[i].f+Floor[i].sum,now)-Floor[i].f;
j+=step-1;
if(j>=Floor[i].sum)
j-=Floor[i].sum;
if(j<0)
j=Floor[i].sum-1;
now=Floor[i].f[j];
}
cout<<ans;
return 0;
}