NOIP2012T2 寻宝

 

#include<cstdio>
using namespace std;
int c[10010],a[10010][101],b[10001][101];
int main(){
    int i,j,n,m,t;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        for(j=0;j<m;j++){
            scanf("%d%d",&a[i][j],&b[i][j]);
            if(a[i][j]==1) c[i]++;}  //a数组表示当前房间有没有楼梯,b数组表示当前房间的指示牌 
    scanf("%d",&t);
    j=t;
    int x=0,temp=0;
    for(i=1;i<=n;i++){
        x+=b[i][t];x%=20123;
        j=t;
        temp=0;
        if(b[i][t]%c[i]==0) b[i][t]=c[i];  //为了防止指示牌上是一个比m大很多倍的数,循环太多遍会超限 
        else b[i][t]=b[i][t]%c[i];
        if(a[i][t]==1) temp++;  //如果起点有楼梯,要减去当前楼梯 
       while(temp<b[i][t]){ //找第二层的起始位置 
           j++; if(j>=m)j=0;
           if(a[i][j]==1) temp++;
       }
       t=j;
    }
    printf("%d\n",x);
    return 0;
}

  

 

 

 

type
    room=record
        v:0..1;
        p:longint;
    end;
var
    n,m,i,j,k,s,ans,q:longint;
    a:array[1..10000,0..99] of room;
    num:array[1..10000] of longint;
begin
    assign(input,'treasures.in'); reset(input);
    assign(output,'treasures.out'); rewrite(output);
    fillchar(num,sizeof(num),0);
    readln(n,m);
    for i:=1 to n do
        for j:=0 to m-1 do
        begin
            readln(a[i,j].v,a[i,j].p);
            if a[i,j].v=1 then inc(num[i]);
        end;
    readln(s);
    for i:=1 to n do
    begin
        ans:=(ans+a[i,s].p) mod 20123;
        q:=(a[i,s].p+num[i]-1) mod num[i] +1;
        s:=s-1;
        while q>0 do
        begin
            s:=(s+1)mod m;
            if(a[i,s].v=1) then dec(q);
        end;
    end;
    writeln(ans);
    close(input);  close(output);
end.

 

 

type
    room=record
        t:0..1;
        f:longint;
    end;
var
    n,m,i,j,s,ans,q:longint;
    a:array[1..10000,0..99] of room;
    num:array[1..10000] of longint;
begin
    assign(input,'treasures.in'); reset(input);
    assign(output,'treasures.out'); rewrite(output);
    fillchar(num,sizeof(num),0);
    readln(n,m);
    for i:=1 to n do
        for j:=0 to m-1 do
        begin
            readln(a[i,j].t,a[i,j].f);
            num[i]:=num[i]+a[i,j].t;//if a[i,j].t=1 then inc(num[i]);
        end;
    readln(s);
    for i:=1 to n do
    begin
        ans:=(ans+a[i,s].f) mod 20123;
        q:=(a[i,s].f+num[i]-1) mod num[i] +1; //q:=a[i,s].f mod num[i] + num[i];
        while true do
        begin
            while a[i,s].t=0 do s:=(s+1)mod m;
            dec(q);
            if q=0 then break;
            s:=(s+1)mod m;
        end;
    end;
    writeln(ans);
    close(input);  close(output);
end.

 

  

type
    room=record
        t:0..1;
        f:longint;
    end;
var
    n,m,i,j,s,ans,q:longint;
    a:array[1..10000,0..99] of room;
    num:array[1..10000] of longint;
begin
    assign(input,'treasures.in'); reset(input);
    assign(output,'treasures.out'); rewrite(output);
    fillchar(num,sizeof(num),0);
    readln(n,m);
    for i:=1 to n do
        for j:=0 to m-1 do
        begin
            readln(a[i,j].t,a[i,j].f);
            num[i]:=num[i]+a[i,j].t;//if a[i,j].t=1 then inc(num[i]);
        end;
    readln(s);
    for i:=1 to n do
    begin
        ans:=(ans+a[i,s].f) mod 20123;
        q:=(a[i,s].f+num[i]-1) mod num[i] +1; //q:=a[i,s].f mod num[i] + num[i];
        for j:=a[i,s].t to q-1 do
            repeat s:=(s+1)mod m; until a[i,s].t=1;
    end;
    writeln(ans);
    close(input);  close(output);
end.

 

转载于:https://www.cnblogs.com/qilinart/articles/3384201.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值