CSP-J模拟赛day6——解析+答案-寻宝

因为这道题的x过大,直接枚举是一定过不了的,但是我们不难发现,这是有循环的,所以我们直接在这里取余就可以了,但是我们又要注意一下当前房间是有楼梯的情况,所以我们可以在此基础上加上一圈在减去当前的情况(有楼梯为1,没有为0),如果是有的,那么就会少跑一点,如果没有,再跑一圈也是可以的。

#include<bits/stdc++.h>
using namespace std;

struct f{
	int num,s;
};
f mp[10010][110];
int x,tot[10010];
long long ans;
int main(){
	//freopen("treasure.in","r",stdin);
	//freopen("treasure.out","w",stdout);
	int n,m;
	cin>>n>>m;
	for (int i=1;i<=n;i++){
		for (int j=0;j<m;j++){
			cin>>mp[i][j].s>>mp[i][j].num;
			if (mp[i][j].s==1)tot[i]++;
		}
	}
	cin>>x;
	for (int i=1;i<=n;i++){
		int tmp1=mp[i][x].num,tmp2=mp[i][x].s;
		ans+=tmp1,ans%=20123;
		tmp1=tmp1%tot[i]+tot[i]-tmp2;
		while (tmp1>0){
			x=(x+1)%m;
			if (mp[i][x].s==1)tmp1--;
		}
	}
	cout<<ans%20123;
	return 0;
}
上一篇:通过比较list与vector在简单模拟实现时的不同进一步理解STL的底层


下一篇:LSL常见应用场景及示例<一>