第二题 寻宝
#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,它怎么找?
然后就没有然后了。