73pts求助 WA on #3 #4 #7
查看原帖
73pts求助 WA on #3 #4 #7
474551
jimmy2021楼主2022/5/28 10:41

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <limits.h>
#include <cstring>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> PII;
const int INF = 0x3f3f3f3f, INF_BIT = 0x3f;

const int N = 1010;

LL n, c;
struct Node{
    LL x, h, v;
};
Node a[N];

LL d[N][N][2];
LL tm[N][N][2];

int main(){
    scanf("%lld%lld", &n, &c);
    for(LL i = 1;i <= n;i++){
        scanf("%lld", &a[i].x);
    }
    for(LL i = 1;i <= n;i++){
        scanf("%lld", &a[i].h);
    }
    for(LL i = 1;i <= n;i++){
        scanf("%lld", &a[i].v);
    }
    
    a[++n] = {c, 0, 0};
    
    sort(a + 1, a + n + 1, [](Node a, Node b){return a.x < b.x;});
    
    for(LL l = 1;l <= n;l++)
        for(LL r = l;r <= n;r++)
            d[l][r][0] = d[l][r][1] = -(2e11 + 1);
    
    LL ind = -1;
    for(LL i = 1;i <= n;i++)
        if(a[i].x == c && a[i].h == 0 && a[i].v == 0){
            ind = i;
            break;
        }
    
    d[ind][ind][0] = d[ind][ind][1] = 0;
    
    for(LL len = 2;len <= n;len++){
        for(LL l = 1;l + len - 1 <= n;l++){
            LL r = l + len - 1;
            
            LL q1, q2;
            
            q1 = d[l + 1][r][0] + (a[l].h - a[l].v * (tm[l + 1][r][0] + a[l + 1].x - a[l].x));
            q2 = d[l + 1][r][1] + (a[l].h - a[l].v * (tm[l + 1][r][1] + a[r].x - a[l].x));
            d[l][r][0] = max(q1, q2);
            if(q1 > q2) tm[l][r][0] = tm[l + 1][r][0] + a[l + 1].x - a[l].x;
            else if(q1 < q2) tm[l][r][0] = tm[l + 1][r][1] + a[r].x - a[l].x;
            else tm[l][r][0] = min(tm[l + 1][r][0] + a[l + 1].x - a[l].x, tm[l + 1][r][1] + a[r].x - a[l].x);
            
            q1 = d[l][r - 1][1] + (a[r].h - a[r].v * (tm[l][r - 1][1] + a[r].x - a[r - 1].x));
            q2 = d[l][r - 1][0] + (a[r].h - a[r].v * (tm[l][r - 1][0] + a[r].x - a[l].x));
            d[l][r][1] = max(q1, q2);
            if(q1 > q2) tm[l][r][1] = tm[l][r - 1][1] + a[r].x - a[r - 1].x;
            else if(q1 < q2) tm[l][r][1] = tm[l][r - 1][0] + a[r].x - a[l].x;
            else tm[l][r][1] = min(tm[l][r - 1][1] + a[r].x - a[r - 1].x, tm[l][r - 1][0] + a[r].x - a[l].x);
        }
    }
    
    LL ans = max(d[1][n][0], d[1][n][1]);
    printf("%.3lf\n", ans / 1000.0);
    return 0;
}

部分变量意思解释:dl,r,k (k{0,1})d_{l, r, k}\ (k \in \{0, 1\}) 的含义是获得了 [l,r][l, r] 内的所有彩蛋,如果 k=0k = 0,那么表示现在在 ll 处,否则表示现在在 rr 处,能获得的最大魅力值之和tml,r,k (k{0,1})tm_{l, r, k}\ (k \in \{0, 1\}) 的含义是获得了 [l,r][l, r] 内的所有彩蛋,如果 k=0k = 0,那么表示现在在 ll 处,否则表示现在在 rr 处,在获得了最大魅力值之和的前提下,最小的时间之和

2022/5/28 10:41
加载中...