luoguP2466 [SDOI2008]Sue的小球

此题与\(luoguP1220\)关路灯类似,但是这个题目的收益随时间的变化而变化.

起初我思考来一个三维\(dp\),即两维坐标,一维时间.

可惜爆了空间(艹).

但是由于时间是线性的,所以我们可以反着设.

即设\(dp[0/1][st][ed]\)表示处理完按坐标排序后的第\(st\)个蛋到第\(ed\)个蛋被处理完后对于剩下的蛋所产生的影响.

答案即为\(\sum^{n}_{i=1}y[i]-\min(dp[0][1][n],dp[1][1][n])\).

转移即为普通的区间\(dp\)套路.
\[
\begin{align}
dp[0][st][ed]=&min(dp[0][st][ed],min(\\&dp[0][st+1][ed]+(sum[n]+sum[st]-sum[ed])*(a[st + 1].x - a[st].x),\\&dp[1][st + 1][ed] + (sum[n] + sum[st] - sum[ed]) * (a[ed].x - a[st].x)));\dp[1][st][ed]=&min(dp[1][st][ed],min(\\&dp[1][st][ed - 1] + (sum[n] + sum[st - 1] - sum[ed - 1]) * (a[ed].x - a[ed - 1].x),\\&dp[0][st][ed - 1] + (sum[n] + sum[st - 1] - sum[ed - 1]) * (a[ed].x - a[st].x)));
\end{align}
\]

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define il inline
#define rg register
#define gi read<int>
using namespace std;
const int O = 1010;
template<class TT>
il TT read() {
    TT o = 0,fl = 1; char ch = getchar();
    while (!isdigit(ch) && ch != '-') ch = getchar();
    if (ch == '-') fl = -1, ch = getchar();
    while (isdigit(ch)) o = o * 10 + ch - '0', ch = getchar();
    return fl * o;
}
struct Data {
    int x, y, v;
    il bool operator < (Data rhs) const {
        return x < rhs.x;
    }
}a[O];
int n, St, sum[O], dp[2][O][O], Sum;
int main() {
    memset(dp, 63, sizeof dp);
    n = gi() + 1, a[1].x = St = gi();
    for (int i = 2; i <= n; ++i) a[i].x = gi();
    for (int i = 2; i <= n; ++i) a[i].y = gi(), Sum += a[i].y;
    for (int i = 2; i <= n; ++i) a[i].v = gi();
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + a[i].v;
    for (int i = 1; i <= n; ++i)
        if (!a[i].v && a[i].x == St) {
            dp[0][i][i] = dp[1][i][i] = 0;
            break;
        }
    for (int len = 1; len < n; ++len)
        for (int st = 1; st + len <= n; ++st) {
            int ed = st + len;
            dp[0][st][ed] = min(dp[0][st][ed], min(dp[0][st + 1][ed] + (sum[n] + sum[st] - sum[ed]) * (a[st + 1].x - a[st].x), dp[1][st + 1][ed] + (sum[n] + sum[st] - sum[ed]) * (a[ed].x - a[st].x)));
            dp[1][st][ed] = min(dp[1][st][ed], min(dp[1][st][ed - 1] + (sum[n] + sum[st - 1] - sum[ed - 1]) * (a[ed].x - a[ed - 1].x), dp[0][st][ed - 1] + (sum[n] + sum[st - 1] - sum[ed - 1]) * (a[ed].x - a[st].x)));
        }
    printf("%.3lf\n", (Sum - min(dp[1][1][n], dp[0][1][n])) / 1000.);
    return 0;
}

原文地址:https://www.cnblogs.com/lylyl/p/11715822.html

时间: 2025-01-18 02:53:38

luoguP2466 [SDOI2008]Sue的小球的相关文章

【BZOJ2037】[Sdoi2008]Sue的小球 区间DP+费用提前

[BZOJ2037][Sdoi2008]Sue的小球 Description Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一个秘密武器,只要她将小船划到一个彩蛋的正下方,然后使用秘密武器便可以在瞬间收集到这个彩蛋.然而,彩蛋有一个魅力值,这个魅力值会随着彩蛋在空中降落的时间而降低,Sue要想得到更多的分数,必须尽量在魅力值高的时候收集这个彩蛋,而如果一个

Bzoj2037 [Sdoi2008]Sue的小球

Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 672  Solved: 372 Description Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一个秘密武器,只要她将小船划到一个彩蛋的正下方,然后使用秘密武器便可以在瞬间收集到这个彩蛋.然而,彩蛋有一个魅力值,这个魅力值会随着彩蛋在空中降落的时间而降低,

Luogu[SDOI2008]Sue的小球

题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一个秘密武器,只要她将小船划到一个彩蛋的正下方,然后使用秘密武器便可以在瞬间收集到这个彩蛋.然而,彩蛋有一个魅力值,这个魅力值会随着彩蛋在空中降落的时间而降低,Sue要想得到更多的分数,必须尽量在魅力值高的时候收集这个彩蛋,而如果一个彩蛋掉入海中,它的魅力值将会变成一个负数,但这并不影响Sue的兴趣,

洛谷 P2466 Sue的小球 解题报告

P2466 [SDOI2008]Sue的小球 题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一个秘密武器,只要她将小船划到一个彩蛋的正下方,然后使用秘密武器便可以在瞬间收集到这个彩蛋.然而,彩蛋有一个魅力值,这个魅力值会随着彩蛋在空中降落的时间而降低,Sue要想得到更多的分数,必须尽量在魅力值高的时候收集这个彩蛋,而如果一个彩蛋掉入海中,它的魅力

BZOJ 2037 Sue的小球

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2037 题意:二维平面上有一些彩蛋(x,y),每个彩蛋会下落.当移动到彩蛋下方时会获得彩蛋,价值为此时彩蛋的高度.初始位置给出(只能在x轴上移动).求一种移动的方式使得获得的总价值最大.(所有彩蛋都要拿到) 思路: int f[2][N][N],sum[N]; int visit[N][N]; struct node { int x,y,v; }; node a[N]; int n,x0

BZOJ 4698: Sdoi2008 Sandy的卡片

4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 225  Solved: 95[Submit][Status][Discuss] Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积 攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列长度为Mi,要想兑换人物模型 ,首先必须要集够N张卡片,对

[Sdoi2008]Sandy的卡片

[Sdoi2008]Sandy的卡片 题目 Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列长度为Mi,要想兑换人物模型,首先必须要集够N张卡片,对于这N张卡片,如果他们都有一个相同的子串长度为k,则可以兑换一个等级为k的人物模型.相同的定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串.Sandy的卡片数远远小于要求的N,于是Sue决定

小tips:用java模拟小球做抛物线运动

这几天刚刚学习了java线程,然后跟着书做了几个关于线程的练习,其中有一个练习题是小球动起来.这个相信很简单,只要运用线程就轻松能够实现.然后看到了它的一个课后思考题,怎样让小球做个抛物线运动,这点我调试了很久,上网也找了很多资料,但是没有那种适合我们小白的教程,于是我简单讲讲我的思路.我将从如何画一个小球开始到一步步实现小球进行抛物线运动.嘿嘿!! 一.任务分解 现在我们来做抛物线运动的小球,先不急写代码,先来想象一下做好的结果是什么样子的.我将这个任务分成三步,第一步,画一个小球:第二步,该

BZOJ 3229: [Sdoi2008]石子合并

3229: [Sdoi2008]石子合并 时间限制: 3 Sec  内存限制: 128 MB提交: 497  解决: 240[提交][][] 题目描述 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将N堆石子合并成一堆的最小得分. 输入 第一行是一个数N. 以下N行每行一个数A,表示石子数目. 输出 共一个数,即N堆石子合并成一堆的最小得分. 样例输入 4 1 1 1 1 样