题目链接

题目描述

Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船。然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue有一个秘密武器,只要她将小船划到一个彩蛋的正下方,然后使用秘密武器便可以在瞬间收集到这个彩蛋。然而,彩蛋有一个魅力值,这个魅力值会随着彩蛋在空中降落的时间而降低,Sue要想得到更多的分数,必须尽量在魅力值高的时候收集这个彩蛋,而如果一个彩蛋掉入海中,它的魅力值将会变成一个负数,但这并不影响Sue的兴趣,因为每一个彩蛋都是不同的,Sue希望收集到所有的彩蛋。
然而Sandy就没有Sue那么浪漫了,Sandy希望得到尽可能多的分数,为了解决这个问题,他先将这个游戏抽象成了如下模型:
以Sue的初始位置所在水平面作为x轴。
一开始空中有N个彩蛋,对于第i个彩蛋,他的初始位置用整数坐标(xi, yi)表示,游戏开始后,它匀速沿y轴负方向下落,速度为vi单位距离/单位时间。Sue的初始位置为(x0, 0),Sue可以沿x轴的正方向或负方向移动,Sue的移动速度是1单位距离/单位时间,使用秘密武器得到一个彩蛋是瞬间的,得分为当前彩蛋的y坐标的千分之一。
现在,Sue和Sandy请你来帮忙,为了满足Sue和Sandy各自的目标,你决定在收集到所有彩蛋的基础上,得到的分数最高。

题解

这题和LuoguP1220 关路灯简直是一道题。
只是把数据变成了实数,然后稍微把最后的结果的求法改了一下,但主体部分一毛一样。
做了关路灯这题应该秒A不是吗?
进入正题。
为了方便,我们新加一个蛋,x=x0,y=v=0
这样就免去了判断人在哪。
然后我们可以把求总和最大改为每个蛋的分数降低总和最少。
我们拿掉的egg一定是一段连续的吧,因为我们经过了就会拿走。
那么容易想到这是一个区间dp。
并且我们发现拿完一个区间的egg后要么是在左端点,要么是在右端点。
于是设dp[i][j][0/1]表示我把i到j的蛋全拿了,让后我在左端点还是右端点dp[i][j][0/1]表示我把i到j的蛋全拿了,让后我在左端点还是右端点dp[i][j][0/1] 表示我把i到j的蛋全拿了,让后我在左端点还是右端点
让后直接就枚举区间长度和左端点就开始dp了。中间虽然有很多不合法状态,但对答案不产生任何影响,所以直接安心转移就行了(具体看代码)。

时间复杂度O(n2)O(n2)O(n^2)
代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<cstring>
#include<set>
#define min(a,b) ((a)<(b)? (a):(b))
#define max(a,b) ((a)>(b)? (a):(b))
#define Set(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int read()
{int x=0;char ch=getchar();int t=1;for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') t=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48);return x*t;
}
const int N=1e3+10;
struct egg{double x,y;double v;inline bool operator <(egg b)const{return x<b.x;}
}a[N];
typedef double db;
typedef long long ll;
db dp[N][N][2];
ll sum[N];
int n;
double x0;
int main()
{n=read();x0=1.000*read();db Sum=0;for(register int i=1;i<=n;i++) a[i].x=1.000*read();for(register int i=1;i<=n;i++) a[i].y=1.000*read(),Sum+=a[i].y;for(register int i=1;i<=n;i++) a[i].v=1.000*read();n++;a[n].x=x0;a[n].y=0;a[n].v=0;sort(a+1,a+1+n);register int P;for(register int i=1;i<=n;i++) if(a[i].x==x0&&a[i].y==0&&a[i].v==0) {P=i;break;}for(register int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].v;db INF=1e10;for(register int i=0;i<=n+1;i++){for(register int j=i;j<=n+1;j++){dp[i][j][0]=dp[i][j][1]=dp[j][i][0]=dp[j][i][1]=INF;}}dp[P][P][0]=dp[P][P][1]=0;//人在的egg瞬间拿走for(register int D=2;D<=n;D++){for(register int l=1;l+D-1<=n;l++){register int r=l+D-1;register db tot=sum[n]-sum[r]+sum[l];dp[l][r][0]=min(dp[l+1][r][0]+(a[l+1].x-a[l].x)*tot,dp[l+1][r][1]+(a[r].x-a[l].x)*tot);//最后在左则一定从右边某端点过来tot=sum[n]-sum[r-1]+sum[l-1];dp[l][r][1]=min(dp[l][r-1][0]+(a[r].x-a[l].x)*tot,dp[l][r-1][1]+(a[r].x-a[r-1].x)*tot);//同理}}db ans=min(dp[1][n][1],dp[1][n][0]);ans=(Sum-ans)/1000.000;printf("%.3lf",ans);
}

【LuoguP2466】[SDOI2008] Sue的小球相关推荐

  1. [SDOI2008]SUE的小球

    [SDOI2008]SUE的小球 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Form ...

  2. Bzoj2037: [Sdoi2008]Sue的小球

    题面 传送门 Sol 就相当于从\(x_0\)开始左右横走,显然可以设\(f[0/1][i][j]\)表示左到\(i\)右到\(j\),当前在左/右的代价 但是不好记转移代价,因为不知道时间 那么可以 ...

  3. BZOJ 2037 Sue的小球

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2037 题意:二维平面上有一些彩蛋(x,y),每个彩蛋会下落.当移动到彩蛋下方时会获得彩蛋 ...

  4. 2017.10.27 sue的小球 失败总结

    这个题是论文题...说这个题之前先说一下关路灯 这两个题都有时间的限制,但都不能作为状态设计进去 关路灯那个题,由于要忽略时间的限制,所以对于一个区间省得最多,是不是就是最优解了呢 首先,就算你知道这 ...

  5. 动态规划--from zpz

    版权声明:copy from zpz,我可能要修改 https://blog.csdn.net/qq_40828060/article/details/83064425 文章目录 前言 记忆化搜索 动 ...

  6. 动态规划,且学且放弃

    文章目录 前言 记忆化搜索 动态规划的基本解题思路 背包问题 01背包 (待处理)P1489 猫狗大战 01背包的空间优化问题 P1048 采药 P1510 精卫填海 P1566 加等式 P1504 ...

  7. 2022-2028年中国小球产业深度调研及投资前景预测报告(全卷)

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了小球行业相关概述.中国小球行业运行环境.分析了中国小球行业的现状.中 ...

  8. 树莓派视觉小车 -- 小球追踪(颜色追踪)(OpenCV色彩空间HSV)

    目录 效果展示 基础理论(HSV) 为什么用HSV空间而不是RGB空间? HSV 1.Hue(色相) 2.Value(明度) 3.Saturation(饱和度) 一.初始化 滑动条初始化 1.创建回调 ...

  9. BZOJ 2190: [SDOI2008]仪仗队( 欧拉函数 )

    假设C君为(0, 0), 则右上方为(n - 1, n - 1). 一个点(x, y) 能被看到的前提是gcd(x, y) = 1, 所以 answer = ∑ phi(i) * 2 + 2 - 1 ...

  10. android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果

    本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在on ...

最新文章

  1. pythonidle新建文件_(一)Python入门:04IDLE开发环境的使用-建立Python源文件
  2. hdu 6112 今夕何夕
  3. [Python基础]003.语法(2)
  4. 百度PRNN:增强GPU伸缩性,RNN训练最高提速30倍(源码下载)
  5. Spring AOP详解一文搞懂@Aspect、@Pointcut、@Before、@Around、@After、@AfterReturning、@AfterThrowing
  6. C++的类和C里面的struct有什么区别
  7. 怎么实现hover_web前端CSS实现一个粒子动效的按钮
  8. 开年福利!OpenMMLab 全新企划,等你来
  9. php修改隐藏域非法提交,PHP get、post变量放在表单隐藏域示例
  10. python信用评分卡_基于Python的信用评分卡模型分析(二)
  11. ASIHTTPRequest类库简介
  12. Markdown语法(一)标题段落分割线
  13. Java-微信公众号-上(环境搭建+基础回复功能)
  14. 如何给文件添加everyone权限
  15. 2021-08-18-ideal配置github时报:insufficient scopes granted to the token
  16. 考研英语 单词常见熟词生义
  17. 高通8953调试I2S小记
  18. 最全的阿里面试经验(一)
  19. sed编辑器之修改行
  20. efci 计算机网络,数值型关联规则挖掘在网络入侵检测系统中的应用研究

热门文章

  1. 图像处理之EXIF信息
  2. 物流配送中商品订货数量的控制技术
  3. 使用select2 实现拼音全拼和首字母 搜索
  4. 广工anyview数据结构第七章(2021.12)
  5. mac如何使用命令行删除文件
  6. ruby语言学习-开启篇
  7. 去除最新版WinRAR的弹窗广告
  8. WOai wojiao
  9. 百度竞价账户关键词分类
  10. 第一天:2个法则,你的第一桶金可以这么来