1、其实我已经做了优化(取模,把带楼梯房间加入队列),但是用Cena测评,最大的一组数据却要1.5s才能过(超过1s),刚在想我怎么越来越长出息了连普及组题目都过不了了,突然想到可能是因为文件太大了输入需要很长时间所以超时了,果不其然交到tyvj上就过了。
2、这题就是约瑟夫问题的变形,注意取模的时候要特殊处理,因为“走的房间数”是从1开始编号的。比如说要走过5个带楼梯的房间,但这层楼一共就5个带楼梯的房间,所以一取模就是0个房间了,显然不对,所以要特判——写了一个change函数。
3、平心而论,还真是比较麻烦的题目,现在的初中生不得了啊。
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,x,y,num,sum=0,temp;
struct room{
int up,no;
}a[10010][110];
int b[10010][110];
int c[10010];
int change(int n,int i){
if(n%c[i]==0)
return c[i];
else return n%c[i];
}
int main(){
freopen("treasure.in","r",stdin);
freopen("treasure.out","w",stdout);
scanf("%d%d",&n,&m);
memset(c,0,sizeof(c));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
scanf("%d%d",&a[i][j].up,&a[i][j].no);
if(a[i][j].up==1)
b[i][c[i]++]=j;
}
scanf("%d",&num);
for(int i=0;i<n;i++){
temp=change(a[i][num].no,i);
sum=(a[i][num].no+sum)%20123;
while(a[i][num].up!=1) num=(num+1)%m;
int j;
for(j=0;j<c[i];j++)
if(b[i][j]==num) break;
j=(j+temp-1)%c[i];
num=b[i][j];
}
printf("%d\n",sum);
return 0;
}