P2466 [SDOI2008]Sue的小球

题目描述

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

然而Sandy就没有Sue那么浪漫了,Sandy希望得到尽可能多的分数,为了解决这个问题,他先将这个游戏抽象成了如下模型:

以Sue的初始位置所在水平面作为\(x\)轴。

一开始空中有\(N\)个彩蛋,对于第\(i\)个彩蛋,他的初始位置用整数坐标\((xi, yi)\)表示,游戏开始后,它匀速沿\(y\)轴负方向下落,速度为\(v_i\)单位距离/单位时间。Sue的初始位置为\((x0, 0)\),Sue可以沿x轴的正方向或负方向移动,Sue的移动速度是1单位距离/单位时间,使用秘密武器得到一个彩蛋是瞬间的,得分为当前彩蛋的\(y\)坐标的千分之一。

现在,Sue和Sandy请你来帮忙,为了满足Sue和Sandy各自的目标,你决定在收集到所有彩蛋的基础上,得到的分数最高。

输入输出格式

输入格式:

第一行为两个整数\(N\), \(x0\)用一个空格分隔,表示彩蛋个数与Sue的初始位置。

第二行为\(N\)个整数\(x_i\),每两个数用一个空格分隔,第\(i\)个数表示第\(i\)个彩蛋的初始横坐标。

第三行为\(N\)个整数\(y_i\),每两个数用一个空格分隔,第\(i\)个数表示第\(i\)个彩蛋的初始纵坐标。

第四行为\(N\)个整数\(v_i\),每两个数用一个空格分隔,第\(i\)个数表示第\(i\)个彩蛋匀速沿\(y\)轴负方向下落的的速度。

输出格式:

一个实数,保留三位小数,为收集所有彩蛋的基础上,可以得到最高的分数。

说明

对于30%的数据,\(N<=20\)。

对于60%的数据,\(N<=100\)。

对于100%的数据,\(-10^4 <= xi,yi,vi <= 10^4,N < = 1000\)


从暴力开始

我们发现,对于当前时间所处的每一个位置,我们有且仅有两个选择(即向左或向右)

30分到手,\(O(2^N)\)的复杂度。

既然有向左或向右的选择,很容易联想到DP上去啊。

令\(dp[i][j]\)代表已经处理左端为\(i\)号彩蛋和右端为\(j\)号彩蛋时的区间所产生的最大分数。

试试写转移的话,我们会发现两个问题。

  1. 对于当前位置的信息我们需要存储一下,也就是在左端点还是右端点,多开一维维护即可。

  2. 对于彩蛋的分数,是和时间挂钩的,如果想完整的求解,得把时间压进去啊。

时间压进去肯定爆了有没有别的办法呢?

当然有,每一个点的最终得分其实不就等于 它的初始得分 减去 它的损失分 吗

我们尝试维护这样一个损失分的最小值。

对于 每一段转移的时候 我们都能求出 这段时间内 还没有得到的彩蛋的分的 损失值

\(dp[i][j][0]=min(dp[i+1][j][0]+(t[i+1].x-t[i].x)*(sumv[i]+sumv[n]-sumv[j]),\)

\(dp[i+1][j][1]+(t[j].x-t[i].x)*(sumv[i]+sumv[n]-sumv[j]));\)

\(dp[i][j][1]=min(dp[i][j-1][0]+(t[j].x-t[i].x)*(sumv[i-1]+sumv[n]-sumv[j-1]),\)

\(dp[i][j-1][1]+(t[j].x-t[j-1].x)*(sumv[i-1]+sumv[n]-sumv[j-1]));\)

其中,\(sumv[i]\)维护的是速度的前缀和数组。


code:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1002;
double x0,sumv[N],sumy;
int n;
double dp[N][N][2];
double abs(double x) {return x>0?x:-x;}
struct node
{
double x,y,v;
bool friend operator <(node n1,node n2)
{
return n1.x<n2.x;
}
}t[N];
int main()
{
scanf("%d%lf",&n,&x0);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dp[i][j][0]=dp[i][j][1]=1e300;
for(int i=1;i<=n;i++)
scanf("%lf",&t[i].x);
for(int i=1;i<=n;i++)
{
scanf("%lf",&t[i].y);
sumy+=t[i].y;
}
for(int i=1;i<=n;i++)
scanf("%lf",&t[i].v);
sort(t+1,t+1+n);
for(int i=1;i<=n;i++)
sumv[i]=sumv[i-1]+t[i].v;
for(int i=1;i<=n;i++)
dp[i][i][0]=dp[i][i][1]=(abs(t[i].x-x0))*sumv[n];
for(int i=n-1;i>=1;i--)
for(int j=i+1;j<=n;j++)
{
dp[i][j][0]=min(dp[i+1][j][0]+(t[i+1].x-t[i].x)*(sumv[i]+sumv[n]-sumv[j]),
dp[i+1][j][1]+(t[j].x-t[i].x)*(sumv[i]+sumv[n]-sumv[j]));
dp[i][j][1]=min(dp[i][j-1][0]+(t[j].x-t[i].x)*(sumv[i-1]+sumv[n]-sumv[j-1]),
dp[i][j-1][1]+(t[j].x-t[j-1].x)*(sumv[i-1]+sumv[n]-sumv[j-1]));
}
printf("%.3lf\n",(sumy-min(dp[1][n][0],dp[1][n][1]))/1000.0);
return 0;
}

我居然又在离散化(排序)之前求了\(sumv\),还找了许久的错啊。。。

丢人。。


2018.5.21

洛谷 P2466 Sue的小球 解题报告的更多相关文章

  1. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  2. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  3. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  4. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  5. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  6. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  7. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  8. NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告

    前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...

  9. 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告

    P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...

随机推荐

  1. [spark][python]Spark map 处理

    map 就是对一个RDD的各个元素都施加处理,得到一个新的RDD 的过程 [training@localhost ~]$ cat names.txtYear,First Name,County,Sex ...

  2. cp 命令有坑

    cp 是个很常用的命令, 基本语法为  cp -v  a   b  把文件a 复制为文件b(-v为显示做了什么,这是非常安全的做法,建议新手添加此参数) 参数说明: -a:此选项通常在复制目录时使用, ...

  3. .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统

    .NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言     相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...

  4. WPF制作带明细的环形图表

    效果 明细用Popup实现的,录gif时,Popup显示不出来,不知道为什么,所以静态图凑合看吧 大体思路 图表使用Arc+Popup实现 图表分为两部分,一是环形部分,一是标注的明细部分. 环形部分 ...

  5. 批量实现多台服务器之间ssh无密码登录的相互信任关系

    最近IDC上架了一批hadoop大数据业务服务器,由于集群环境需要在这些服务器之间实现ssh无密码登录的相互信任关系.具体的实现思路:在其中的任一台服务器上通过"ssh-keygen -t ...

  6. Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

    Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...

  7. Python-复习-文件操作-21

    # 文件处理 # 打开文件 #open('路径','打开方式','指定编码方式') # 打开方式 r w a r+ w+ a+ b #r+ 打开文件直接写 和读完再写 # 编码方式 —— utf-8 ...

  8. 最新一课 老师指点用Listview适配器

    上课前 <?xml version="1.0" encoding="utf-8"?>    <ScrollView xmlns:android ...

  9. 『编程题全队』Beata阶段项目复审

    小组的名字和链接 优点 缺点,bug 报告(部分包括建议) 最终名次 想不出队名 1. 界面简洁大方2. 有搜索功能 1. 已经完成的活动缺了点提示界面2. 似乎界面有一点点卡顿目标实现:基本实现找到 ...

  10. Notepad++ 大小写转换

    code_field_text 普通文本 code_field_user_id 用户ID code_field_customer_id 客户ID code_field_dict 数据字典 code_f ...