当前位置:网站首页>洛谷P2466 [SDOI2008] Sue 的小球 题解
洛谷P2466 [SDOI2008] Sue 的小球 题解
2022-06-22 14:31:00 【q779】
洛谷P2466 [SDOI2008] Sue 的小球 题解
题意:
Sue 和 Sandy 最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue 有一支轻便小巧的小船。然而,Sue 的目标并不是当一个海盗,而是要收集空中漂浮的彩蛋,Sue 有一个秘密武器,只要她将小船划到一个彩蛋的正下方,然后使用秘密武器便可以在瞬间收集到这个彩蛋。然而,彩蛋有一个魅力值,这个魅力值会随着彩蛋在空中降落的时间而降低,Sue 要想得到更多的分数,必须尽量在魅力值高的时候收集这个彩蛋,而如果一个彩蛋掉入海中,它的魅力值将会变成一个负数,但这并不影响 Sue 的兴趣,因为每一个彩蛋都是不同的,Sue 希望收集到所有的彩蛋。
然而 Sandy 就没有 Sue 那么浪漫了,Sandy 希望得到尽可能多的分数,为了解决这个问题,他先将这个游戏抽象成了如下模型:
将大海近似的看做 x x x 轴,以 Sue 所在的初始位置作为坐标原点建立一个竖直的平面直角坐标系。
一开始空中有 N N N 个彩蛋,对于第 i i i 个彩蛋,他的初始位置用整数坐标 ( x i , y i ) (x_{i}, y_{i}) (xi,yi) 表示,游戏开始后,它匀速沿 y y y 轴负方向下落,速度为 v i v_{i} vi 单位距离/单位时间。Sue 的初始位置为 ( x 0 , 0 ) (x_{0}, 0) (x0,0),Sue 可以沿 x x x 轴的正方向或负方向移动,Sue 的移动速度是 1 1 1 单位距离/单位时间,使用秘密武器得到一个彩蛋是瞬间的,得分为当前彩蛋的 y y y 坐标的千分之一。
现在,Sue 和 Sandy 请你来帮忙,为了满足 Sue 和 Sandy 各自的目标,你决定在收集到所有彩蛋的基础上,得到的分数最高。
对于 100 % 100\% 100% 的数据, − 1 0 4 ≤ x i , y i , v i ≤ 1 0 4 -10^4 \leq x_{i},y_{i},v_{i} \leq 10^4 −104≤xi,yi,vi≤104, N ≤ 1000 N \leq 1000 N≤1000
首先先将彩蛋按 x x x 排序
因为可以左右走,可以想到这是一个区间dp
设 f 0 / 1 , i , j f_{0/1,i,j} f0/1,i,j 表示区间 [ i , j ] [i,j] [i,j] 的彩蛋都被收集后的最小花费(代价),0/1表示此时在 i i i 还是 j j j
转移方程?
注意到当前的决策会受到之前决策的影响,也就是当前的时刻我们并不清楚
考虑增加一维?那就是暴力解法了
那怎么处理这个时刻的问题呢?
我们转化一下刚才的问题,
“当前的决策会受到之前决策的影响”
换句话说,就是当前的决策会影响之后的决策
也就是,现在的时刻会影响之后转移时的物品价值
考虑每次决策时,就把之后的代价先算进去
设 w i , j w_{i,j} wi,j 表示区间 [ i , j ] [i,j] [i,j] 对之后决策造成的影响(代价),不难发现
w i , j = ∑ i = 0 n v i − ∑ k = i j v k w_{i,j} = \sum_{i=0}^{n}v_i - \sum_{k=i}^{j}v_k wi,j=i=0∑nvi−k=i∑jvk
显然可以前缀和优化
当然最重要的是,我们可以很容易地推出转移方程了
f 0 , i , j = min { f 0 , i + 1 , j + ( x i + 1 − x i ) × ( S i + S n − S j ) , f 1 , i + 1 , j + ( x j − x i ) × ( S i + S n − S j ) } f 1 , i , j = min { f 0 , i , j − 1 + ( x j − x i ) × ( S i − 1 + S n − S j − 1 ) , f 1 , i , j − 1 + ( x j − x j − 1 ) × ( S i − 1 + S n − S − j − 1 ) } f_{0,i,j}=\min\left\{f_{0,i+1,j}+(x_{i+1}-x_i)\times(S_i+S_n-S_j),f_{1,i+1,j}+(x_j-x_i)\times(S_i+S_n-S_j)\right\} \\f_{1,i,j}=\min\left\{f_{0,i,j-1}+(x_j-x_i)\times(S_{i-1}+S_n-S_{j-1}), f_{1,i,j-1}+(x_j-x_{j-1})\times(S_{i-1}+S_n-S-{j-1})\right\} f0,i,j=min{ f0,i+1,j+(xi+1−xi)×(Si+Sn−Sj),f1,i+1,j+(xj−xi)×(Si+Sn−Sj)}f1,i,j=min{ f0,i,j−1+(xj−xi)×(Si−1+Sn−Sj−1),f1,i,j−1+(xj−xj−1)×(Si−1+Sn−S−j−1)}
其中 S k = ∑ i = 1 k v k S_k = \sum_{i=1}^{k}v_k Sk=∑i=1kvk
时间复杂度 O ( n 2 ) O(n^2) O(n2)
答案就是 ∑ y i − min { f 0 , 1 , n , f 1 , 1 , n } \sum y_i -\min\left\{f_{0,1,n},f_{1,1,n}\right\} ∑yi−min{ f0,1,n,f1,1,n}
代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(1e3+15)
int n,x0,f0[N][N],f1[N][N];
struct node{
int x,y,v;}a[N];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// freopen("check.in","r",stdin);
// freopen("check.out","w",stdout);
cin >> n >> x0;
for(int i=1; i<=n; i++) cin >> a[i].x;
for(int i=1; i<=n; i++) cin >> a[i].y;
for(int i=1; i<=n; i++) cin >> a[i].v;
a[++n].x=x0;
sort(a+1,a+1+n,[](node a,node b){
return a.x<b.x;});
memset(f0,0x3f,sizeof(f0));memset(f1,0x3f,sizeof(f1));
for(int i=1; i<=n; i++)
if(a[i].x==x0){
f0[i][i]=f1[i][i]=0;}
for(int i=1; i<=n; i++) a[i].v+=a[i-1].v;
for(int len=2; len<=n; len++)
for(int i=1,j=i+len-1; j<=n; i++,j++)
{
f0[i][j]=min(f0[i+1][j]+(a[i+1].x-a[i].x)*(a[i].v+a[n].v-a[j].v),
f1[i+1][j]+(a[j].x-a[i].x)*(a[i].v+a[n].v-a[j].v));
f1[i][j]=min(f0[i][j-1]+(a[j].x-a[i].x)*(a[i-1].v+a[n].v-a[j-1].v),
f1[i][j-1]+(a[j].x-a[j-1].x)*(a[i-1].v+a[n].v-a[j-1].v));
}
int sum=0;
for(int i=1; i<=n; i++) sum+=a[i].y;
cout << fixed << setprecision(3);
cout << ((sum-min(f0[1][n],f1[1][n]))/1000.0) << '\n';
return 0;
}
参考文献
[1] https://www.luogu.com.cn/blog/Bartholomew/solution-p2466
转载请说明出处
边栏推荐
- How MySQL modifies a field to not null
- mysql的concat()函数如何用
- The 12 SQL optimization schemes summarized by professional "brick moving" old drivers are very practical!
- C语言学生成绩排名系统
- What does Alibaba cloud's cipu release mean for enterprise customers?
- Database connection pool: stress testing
- 口令安全是什么意思?等保2.0政策中口令安全标准条款有哪些?
- 基于最小化三维NDT距离的快速精确点云配准
- The bank card identification function of Huawei machine learning service enables bank card identification and binding with one click
- What are the five characteristics of network security? What are the five attributes?
猜你喜欢

DevSecOps: CI/CD 流水线安全的最佳实践

【题目精刷】2023禾赛-FPGA

我靠副业一年全款买房:那个你看不起的行业,未来十年很赚钱!

UK considers listing arm in London based on national security

Runmaide medical passed the hearing: Ping An capital was a shareholder with a loss of 630million during the year

Charles 乱码问题解决

Please, don't be brainwashed. This is the living reality of 90% of Chinese people

mysql如何将字段修改为not null

数据资产管理:数据发现,发现什么,怎么发现?

Self inspection is recommended! The transaction caused by MySQL driver bug is not rolled back. Maybe you are facing this risk!
随机推荐
Once, I had 5 part-time jobs just to buy a new earring for my girlfriend
Verilog使用inout信号的方法
快速排序quick_sort
百行代码实现基于Redis的可靠延迟队列
Driving the efficient growth of the manufacturing industry, UFIDA u9 cloud is constantly improving the password behind it
UK considers listing arm in London based on national security
Database connection pool: Code Directory
The IPO of Tian'an technology was terminated: Fosun and Jiuding were shareholders who planned to raise 350million yuan
How to open an account in flush? Is online account opening safe?
华为机器学习服务银行卡识别功能,一键实现银行卡识别与绑定
Tree structured binary tree
极致效率,云原生数据库TDSQL-C安身立命的根本
专业“搬砖”老司机总结的 12 条 SQL 优化方案,非常实用!
(pytorch进阶之路二)word embedding 和 position embedding
FPGA采集DHT11温湿度
还可以这样搞nlp(分类)
大佬们好,初次使用MySQL cdc 报错
模板特例化 template<>
好风凭借力 – 使用Babelfish 加速迁移 SQL Server 的代码转换实践
Mitsubishi manipulator demo program