比赛 20121106 评测结果 AAAAAAAA
题目名称 过河 最终得分 100
用户昵称 王者自由 运行时间 0.048 s
代码语言 C++ 内存使用 2.94 MiB
提交时间 2012-11-06 10:23:51
显示代码纯文本
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1000 + 10;
int n, m, a[N], b[N];
bool f[N][N];
bool ok(int i, int j) {
    if(i == 0 || i == n + 1) return true;
    int r = j % (a[i] + b[i]);
    return (r > 0 && r <= a[i]);
}
int main() {
    freopen("rivera.in", "r", stdin);
    freopen("rivera.out", "w", stdout);
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
        scanf("%d %d", a+i, b+i);
    m = n * (*max_element(a, a+n+1) + *max_element(b, b+n+1));
    f[0][0] = 1;
    for(int t=1; t<=m; t++) {
        int i = t & 1, l = (t - 1) & 1;
        //fprintf(stderr, "(%d,%d)%d ", i, l, t);
        for(int j=0; j<=n+1; j++) {
            f[i][j] = 0;
            if(ok(j, t))
                for(int k=max(j-5, 0); k<=min(j+5, n+1); k++)
                    if(f[l][k]) { f[i][j] = 1; break; }
        }
        if(f[i][n+1]) { printf("%d\n", t); return 0; }
    } printf("NO\n");
    return 0;
}