社区讨论

55pts 求调!

P1941[NOIP 2014 提高组] 飞扬的小鸟参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo7hynzx
此快照首次捕获于
2023/10/27 02:07
2 年前
此快照最后确认于
2023/10/27 02:07
2 年前
查看原帖
如题,求大佬看看,一个周末了还没看出问题在哪(
感谢!
CPP
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int n, m, k, cnt;
struct pipe {
    int l, h;
} p[10005];
int x[10005], y[10005];
bool vis[10005];
int f[10005][1005];
bool check(int t) {
    for (int i = 1; i <= m; i++) {
        if (f[t][i] != 0x3f3f3f3f) return true;
    }
    return false;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n >> m >> k;
    for (int i = 0; i < n; i++) {
        cin >> x[i] >> y[i];
    }
    for (int i = 0; i < k; i++) {
        int tmp;
        cin >> tmp;
        cin >> p[tmp].l >> p[tmp].h;
        vis[tmp] = true;
    }
    memset(f, 0x3f, sizeof(f));
    for (int i = 1; i <= m; i++) {
        f[0][i] = 0;
    }
    for (int i = 1; i <= n; i++) {
        if (!vis[i]) {
            for (int j = 1; j <= m; j++) {
                if (j + y[i - 1] < (vis[i - 1] ? p[i - 1].h : m + 1)) f[i][j] = min(f[i][j], f[i - 1][j + y[i - 1]]);
                for (int k = 1; ; k++) {
                    if (j - k * x[i - 1] <= (vis[i - 1] ? p[i - 1].l : 0)) {
                        break;
                    }
                    f[i][j] = min(f[i][j], f[i - 1][j - k * x[i - 1]] + k);
                }
                if (j == m) {
                    if (vis[i - 1]) {
                        for (int k = p[i - 1].l + 1; k < p[i - 1].h; k++) {
                            f[i][j] = min(f[i][j], f[i - 1][k] + int(1.0 * (j - k + x[i - 1] - 1) / x[i - 1]));
                        }
                    } else {
                        for (int k = 1; k <= m; k++) {
                            f[i][j] = min(f[i][j], f[i - 1][k] + int(1.0 * (j - k + x[i - 1] - 1) / x[i - 1]));
                        }
                    }
                }
            }
        } else {
            for (int j = p[i].l + 1; j < p[i].h; j++) {
                if (j + y[i - 1] < (vis[i - 1] ? p[i - 1].h : m + 1) && f[i - 1][j + y[i - 1]] != 0x3f3f3f3f) f[i][j] = min(f[i][j], f[i - 1][j + y[i - 1]]);
                for (int k = 1; ; k++) {
                    if (j - k * x[i - 1] <= (vis[i - 1] ? p[i - 1].l : 0)) break;
                    f[i][j] = min(f[i][j], f[i - 1][j - k * x[i - 1]] + k);
                }
            }
        }
        if (!check(i)) {
            break;
        }
        if (vis[i]) cnt++;
    }
    int a = 0x3f3f3f3f;
    for (int i = 1; i <= m; i++) {
        a = min(a, f[n][i]);
//        if (f[n][i] != 0x3f3f3f3f) cout << i << " " << f[n][i] << endl;
    }
    if (a == 0x3f3f3f3f) cout << 0 << endl << cnt << endl;
    else cout << 1 << endl << a << endl;
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...