1958:【12NOIP普及组】寻宝

没啥好说的,直接开始吧

这道题,很难读懂,但是昂,你一旦读懂了,就算点可能那不全,但肯定会有分拿的。

系好安全带,我要开始讲啦(源代码在最后)

 题说有n+1层楼,但我们让他是n层就可以了,最顶层了要输出了嘛。这栋楼有n层高,一栋有m个房间,有些房间有梯子,有些没有,这三个条件,我们就可以用一个三维数组来表示(用两个二维数组也是可以实现,但时间复杂度可能会超)。int a[N][M][2]先建一个这样的数组,然后输入,这是,我们需要有远见一些。我们后面需要按照第一次进入的那个房间里的数字在这一层里转圈,但我们可以不用转圈。再建一个数组s[n]记录每一层的梯子数量,然后在输入里写一个判断

    if(a[i][j][0]==1){
                s[i]++;
            }

这样就可以记录每一层的梯子数量啦,拿每一层的梯子数量去除以房间里的数字的余数,就是我们需要走过的有梯子的房间数量了。

然后就到了关键的地方了,在for循环里套一个while去逛这层的房间,然后输入的第一次进入的房间号接着用,记录下一层第一次进入的房间号,然后一直在楼里逛街,到最顶层就好了(可别忘了设一个变量记录第一次进入的房间的数字,不然可就白做了)。

最后就是源代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int N,M,x;
    int ans=0;
    cin>>N>>M;
    int a[N][M][2];
    int s[N];
    for (int i=0;i<N;i++){
        for (int j=0;j<M;j++){
            cin>>a[i][j][0]>>a[i][j][1];
            if(a[i][j][0]==1){
                s[i]++;
            }
        }
    }cin>>x;
    for(int i=0;i<N;i++){
        ans=(a[i][x][1]+ans)%20123;
        int bianshu=a[i][x][1]%s[i];
        if(bianshu==0){
            bianshu=s[i];
        }if(a[i][x][0]==1){
            bianshu--; 
        }while(bianshu!=0){
            x++;
            if(x==M){
                x=0;
            }if(a[i][x][0]==1){
                bianshu--;
            }
        }
    }cout<<ans; 
    return 0;  
}


最后的最后,如果有没明白的地方,私信我,我一对一讲哦😁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值