NOIP 2012 Vijos 1787普及グループ宝探しシミュレーション

1797 ワード

Vijosでテストに成功しました.
テストデータ#0:Accepted,time=0 ms,mem=25284 KiB,score=10
テストデータ#1:Accepted,time=0 ms,mem=25284 KiB,score=10
テストデータ#2:Accepted,time=0 ms,mem=25280 KiB,score=10
テストデータ3:Accepted,time=54 ms,mem=25288 KiB,score=10
テストデータ#4:Accepted,time=89 ms,mem=25284 KiB,score=10
テストデータ#5:Accepted,time=589 ms,mem=25288 KiB,score=10
テストデータ#6:Accepted,time=628 ms,mem=25280 KiB,score=10
テストデータ#7:Accepted,time=593 ms,mem=25280 KiB,score=10
テストデータ#8:Accepted,time=800 ms,mem=25280 KiB,score=10
テストデータ#9:Accepted,time=824 ms,mem=25280 KiB,score=10
ちょっと遅いです.
シミュレーションすればいいです.
最初はcin/coutと型で5点を超えた.後でscanf/printfと減算に変えればよかったのに...(型というものは遅いですね)
大循環は各階を循環する.
それから案内板の和を計算します.
そして、その階をスキャンして階段を上り、配列に格納します.
そして型を押すと次の階段が見つかります.
循環すればいい.
#include <stdio.h>
#include <string.h>
using namespace std;
#define N 10005
#define M 105


typedef long long ll;


ll n, m, now, i, j;
ll up[N][M], card[N][M], louti[M], loutitot[N], lt[N][M];


ll mod(ll s, ll m) {
    ll r = s;
    while(r>=m) r-=m;
    return r;
}


int main()
{
    scanf("%lld%lld", &n, &m);
    memset(loutitot,0,sizeof(loutitot));
    for(i=1;i<=n;i++)
        for(j=0;j<m;j++)
            scanf("%d%d", &up[i][j], &card[i][j]);
    scanf("%d", &now);
    ll sum = 0;
    for(i=1;i<=n;i++) {
        sum = mod(sum+card[i][now],20123);
        ll d = card[i][now];
        ll k = 0;
        for(j=now;j<m;j++)
            if(up[i][j])
                louti[++k] = j;
        for(j=0;j<now;j++)
            if(up[i][j])
                louti[++k] = j;
        d=mod(d,k);
        if(d==0) d=k;
        now=louti[d];
    }
    printf("%lld", sum);
    return 0;
}