洛谷 P2466 Sue的小球 解题报告
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\)号彩蛋时的区间所产生的最大分数。
试试写转移的话,我们会发现两个问题。
对于当前位置的信息我们需要存储一下,也就是在左端点还是右端点,多开一维维护即可。
对于彩蛋的分数,是和时间挂钩的,如果想完整的求解,得把时间压进去啊。
时间压进去肯定爆了有没有别的办法呢?
当然有,每一个点的最终得分其实不就等于 它的初始得分 减去 它的损失分 吗
我们尝试维护这样一个损失分的最小值。
对于 每一段转移的时候 我们都能求出 这段时间内 还没有得到的彩蛋的分的 损失值
\(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的小球 解题报告的更多相关文章
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告
前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...
- 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告
P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...
随机推荐
- CF 888E Maximum Subsequence
一道比较套路的题,看到数据范围就差不多有想法了吧. 题目大意:给一个数列和\(m\),在数列任选若干个数,使得他们的和对\(m\)取模后最大 取膜最大,好像不能DP/贪心/玄学乱搞啊.\(n\le35 ...
- Luogu P3388 【模板】割点(割顶)
一道求割点的板子题.还是采用经典的Tarjan算法. 首先大致和Tarjan求强连通分量相似,都是用\(dfn_x\)表示访问到\(x\)的时间(时间戳),\(low_x\)表示通过\(x\)回边能走 ...
- Unity3d之树木创建的参数设定
Unity3d之树木创建的参数设定 通常Unity3d创建树木经常会创建出很多奇葩的种类=_=,以下是创建出比较正常树木的基本参数 1:> 基本树干形状建立: 选择根建立分枝干设置分支干Di ...
- C#一些常用的图片操作方法:生成文字图片 合并图片等
生成文字图片: /// <summary> /// 生成文字图片 /// </summary> /// <param name="text">& ...
- dpkg:错误:正在解析文件 '/var/lib/dpkg/updates/0014' 第 0 行附近:在字段名 #padding 中有换行符问题的解决方法
解决方案如下: sudo rm /var/lib/dpkg/updates/* sudo apt-get update python@ubuntu:~/Desktop/_Welcome_.jpg.ex ...
- 分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)
分页查询信息 使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目 ...
- 第七组团队项目——专业课程资源共享平台——需求分析&原型设计
一.项目目标.定位需求: (1)目标:在教师.学生之间建立一个综合的.全面的.快捷的.高效的免费课程和学习资源共享.交流与推荐的开放性平台,实现多维和动态的推荐与分类检索服务. (2)定位:学生与教师 ...
- MCMC等采样算法
一.直接采样 直接采样的思想是,通过对均匀分布采样,实现对任意分布的采样.因为均匀分布采样好猜,我们想要的分布采样不好采,那就采取一定的策略通过简单采取求复杂采样. 假设y服从某项分布p(y),其累积 ...
- 通过LVM给Linux扩容
主要参考以下两篇文章: 1:https://www.cnblogs.com/sixiweb/p/3360008.html 2:https://wenku.baidu.com/view/42deee1a ...
- PHP压力测试使用apache的ab工具和Linux的time命令
ab工具是apache自带的一个压力测试工具,可以在apache的安装路径下的bin目录下找到,我的环境中是在/usr/local/apache/bin/目录下: ab 压测主要使用两个参数: -n ...