记录编号 417848 评测结果 AAAAAAAAAA
题目名称 [NOIP 2012]寻宝 最终得分 100
用户昵称 Gravatarjoel 是否通过 通过
代码语言 C++ 运行时间 0.877 s
提交时间 2017-06-28 09:49:44 内存使用 21.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int M=10000;
const int mod=20123;
int ans;
struct Room
{
	int flag;
	int k;
	int sum;
	int ID;
}a[M+10][110];
int n,m;
int f[M+10][110];
int main()
{
	freopen("treasures.in","r",stdin);
	freopen("treasures.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		int t=0;
		for(int j=0;j<m;j++)
		{
			scanf("%d%d",&a[i][j].flag,&a[i][j].k);
			if(a[i][j].flag)
			{
				a[i][0].sum++;
				f[i][++t]=j;
			}
			a[i][j].ID=t;
		}
	}
	int start,n_c=1;
	scanf("%d",&start);
	int n_r=start;
	while(n_c<n+1)
	{
		int n_k=a[n_c][n_r].k;//牌号
		ans=(ans+n_k)%mod;
		int n_f=a[n_c][n_r].ID;//现牌号
		int n_s=a[n_c][0].sum;//总和
		if(a[n_c][n_r].flag)
			n_f--;
		int n_a=(n_f+n_k%n_s)%n_s;
		if(n_a==0)
			n_a=n_s;
		n_r=f[n_c++][n_a];
		//cout<<n_r<<endl;
	}
	cout<<ans<<endl;
	return 0;
}