NOIp2012 寻宝

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值