思路错还是代码错?错哪里?请有时间的大佬帮忙看一下。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,a[10005][105],num[10005][105],ber[10005][105];
int lef[10005][105],q,ans=0,cnt,cnt_max[10005];
bool b[10005][105];
signed main(){
//freopen("1.in","r",stdin);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
cnt=0;
for(int j=0;j<m;j++){
lef[i][j]=ber[i][cnt]; //记录这个房间左边最近的有楼梯的房间
scanf("%lld%lld",&b[i][j],&a[i][j]);
if(b[i][j]){
num[i][j]=++cnt; //记录这个是第几个有楼梯的房间
ber[i][cnt]=j; //记录第几个有楼梯的房间是它
}
}
for(int j=0;j<=ber[i][1];j++) lef[i][j]=ber[i][cnt];
//0~第一个有楼梯的房间这个区间最左边有楼梯的房间就是最后一个有楼梯的房间
cnt_max[i]=cnt; //作用如后文
ber[i][0]=ber[i][cnt]; //解释如后文
}
scanf("%lld",&q);
for(int i=1;i<=n;i++){
ans+=a[i][q];//记录答案
if(i<n) q=ber[i][(num[i][lef[i][q]]+a[i][q])%cnt_max[i]];
//num[i][left[i][q]]指最 q左边有楼梯的房间是第几个有楼梯的房间
//+a[i][q]是从这个有楼梯的房间开始(这个房间不算) 第 a[i][q]个有楼梯的房间
//有可能大于 m-1,所以 %cnt_max[i]
//有可能模了之后为 0,所以前面才 ber[i][0]=ber[i][cnt]
}
cout<<ans<<endl;
return 0;
}