WA了1个点,真气人,哪位大佬帮看看
查看原帖
WA了1个点,真气人,哪位大佬帮看看
675208
coder2009楼主2024/9/7 14:46

rt,最有一个点wa了,调试半天不知错在哪里

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1005;
struct node {
    double x, y, v;
} a[maxn];
double dp[maxn][maxn][2], s[maxn];

bool cmp(node x, node y) {
    return x.x < y.x;
}

double sum(int l, int r) {
    return a[r].x - a[l].x;
}

void best_coder() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i].x;
    }
    for (int i = 1; i <= n; ++i) {
        cin >> a[i].y;
    }
    for (int i = 1; i <= n; ++i) {
        cin >> a[i].v;
    }
    a[++n].x = m;
    sort(a + 1, a + n + 1, cmp);
    for (int i = 1; i <= n; ++i) {
        s[i] = s[i - 1] + a[i].v;
    }
    memset(dp, -0x3f, sizeof(dp));
    for (int i = 1; i <= n; ++i) {
        if ((a[i].v == 0) && (a[i].x == m)) {
            dp[i][i][1] = dp[i][i][0] = 0;
        }
    }
    for (int i = 2; i <= n; ++i) {
        for (int l = 1; l + i - 1 <= n; ++l) {
            int r = l + i - 1;
            double s0 = s[l] + s[n] - s[r];
            double s1 = s[l - 1] + s[n] - s[r - 1];
            dp[l][r][0] = a[l].y + max(dp[l + 1][r][0] - sum(l, l + 1) * s0, dp[l + 1][r][1] - sum(l, r) * s0);
            dp[l][r][1] = a[r].y + max(dp[l][r - 1][1] - sum(r - 1, r) * s1, dp[l][r - 1][0] - (sum(l, r) * s1));
        }
    }
    cout << fixed << setprecision(3) << max(dp[1][n][1], dp[1][n][0]) / 1000.0;
}

void happy_coder() {

}

int main() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    // 小码匠
    best_coder();

    // 最优解
    // happy_coder();

    return 0;
}
2024/9/7 14:46
加载中...