寻宝

第二题 寻宝

#include<bits/stdc++.h>

using namespace std;

int sum,qqq,q11,kk,k,n,m,a[10001][10001],s[10001][10001],w[10001];

int main(){

cin>>n>>m;

for(int i=1;i<=n;i++)

for(int j=0;j<=m-1;j++)

{

cin>>a[i][j]>>s[i][j];

}

cin>>k;

for(int i=1;i<=n;i++)

for(int j=0;j<=m-1;j++)

{

if(a[i][j]==1)

w[i]++;

}

for(int i=1;i<=n;i++)

{

int k1=0;

kk=s[i][k];

sum+=kk,sum%=20123;

kk%=w[i];

if(kk==0)

{

kk=w[i];

}

for(int j=k;j<=m-1;j++)

{

if(a[i][j]==1)

{

k1++;

if(k1==kk)

{

k=j;

break;

}

}

if(j==m-1)

{

j=-1;

}

}

}

cout<<sum; 

return 0;

}

本来我看了这道题是完全没有心情去做的,字太多了,一看就不会做!!!!!

其实它是非常简单的,不涉及什么复杂的算法,只需要简单的模拟一下过程,再优化一下就行了。

模拟过程如下:

首先输入,

a数组存每个房间是否有阶梯的判断,s数组存每个房间的指示数

用k记录每次到达的那个房间的编号。

用kk记录其指示数,

从第一层开始往上爬,到达第i层,sum+其指示数,从第k号开始遍历,数kk个楼梯房,第kk个就是我们所要找的,此时就可以记录第几号房间停留的,用k更新,再用break停止循环,我们需要考虑到从第k个数到m-1个或许还不够kk个楼梯房,那么我们需要去他的下一个房间也就是第0号房间数个数。

if(j==m-1)

{

j=-1;

}

这个是我的代码实现,用以构成环,因为你想要数第0个,就想办法使j在第m-1个之后变成第0个,我们的循环是j++,使j在下一次成为零,那就使其在这一次成为-1,下一次自然就为0了。

然后提交代码,超时,显然需要优化。

可以在输入数组时直接把每一层有楼梯的个数给数出来,用w数组表示。

直接kk%w[i],省去大部分时间重复寻找,注意如果kk是w[i]的倍数,需要使kk=w[i],否则kk=0,它怎么找?

然后就没有然后了。

猜你喜欢

转载自www.cnblogs.com/xxmxxm/p/10704513.html
今日推荐