首页 > 其他分享 >[SDOI2008]Sue的小球

[SDOI2008]Sue的小球

时间:2022-09-26 22:36:16浏览次数:56  
标签:Sue SDOI2008 int 小球 long times vs include

做题时间:2022.9.26

\(【题目描述】\)

一个平面直角坐标系中有 \(N\) 个小球,第 \(i\) 个小球初始时位于 \((x_i,y_i)\),有一个速度 \(v_i\),每一秒会沿着 \(y\) 轴竖直想下掉 \(v_i\) 个单位,越过 \(x\) 轴后继续下掉。有一个人初始时位于 \((x_0,0)\) 处,每一秒可以向左或右移动一个单位,若移动到某个小球所在的与 \(x\) 轴垂直的直线上,则会捕获这个小球,获得的分数是此时小球的 \(y\) 坐标的千分之一。求在捕获所有小球的前提下能获得的最高分数。

\(【输入格式】\)

第一行两个整数 \(N,x_0\)

第二行 \(N\) 个整数 \(x_i\) 表示小球 \(i\) 的 \(x\) 坐标

第三行 \(N\) 个整数 \(y_i\) 表示小球 \(i\) 的 \(y\) 坐标

第四行 \(N\) 个整数 \(v_i\) 表示小球 \(i\) 的速度。

\(【输出格式】\)

一行一个保留三位小数的实数,表示答案。

\(【考点】\)

区间dp

\(【做法】\)

对于当前决策影响未来的情况,那么直接将对未来的影响计算金当前决策。

首先经过的点都是连续的,可以考虑区间dp,由于当前位置对状态转移有影响,因此定义 \(f_{i,j,0/1}\) 表示捕获完 \([l,r]\) 中的所有小球后停在 \(l\) 或 \(r\) 的位置时的最大得分。

由于每次移动的时候所有未捕获的小球都会下落,因此可以提前减去它们的下落距离。定义 \(vs_i\) 表示速度的前缀和。

\[f_{i,j,0}=\max \begin{cases} f_{i+1,j,0}+y_i-(x_{i+1}-x_{i})\times (vs_n-vs_j+vs_i) \\ f_{i+1,j,1}+y_i-(x_j-x_i)\times (vs_n-vs_j+vs_i) \end{cases} \]

\[f_{i,j,1}=\max \begin{cases} f_{i,j-1,0}+y_j-(x_j-x_i)\times(vs_n-vs_{j-1}+vs_{i-1}) \\ f_{i,j-1,1}+y_j-(x_j-x_{j-1})\times(vs_n-vs_{j-1}+vs_{i-1}) \end{cases} \]

最后答案便是 \(\max(f_{1,n,0},f_{1,n,1})/1000\)

#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
typedef long long ll;
const int N=1e3+50;
struct egg{
	int x,y,v;
}a[N];
int n,sx;
int vs[N];
ll f[N][N][2];
bool cmp(egg p,egg q){return p.x<q.x;}
signed main()
{
	scanf("%lld%lld",&n,&sx);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i].x);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i].y);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i].v);
	sort(a+1,a+1+n,cmp);
	
	for(int i=1;i<=n;i++) vs[i]=vs[i-1]+a[i].v;
	for(int i=1;i<=n;i++) f[i][i][0]=f[i][i][1]=a[i].y-abs(sx-a[i].x)*vs[n];//初始化
	
	for(int len=2;len<=n;len++){
		for(int i=1;i<=n-len+1;i++){
			int j=i+len-1;
			f[i][j][0]=max(f[i+1][j][0]+a[i].y-(ll)(a[i+1].x-a[i].x)*(vs[n]-vs[j]+vs[i]),
						f[i+1][j][1]+a[i].y-(ll)(a[j].x-a[i].x)*(ll)(vs[n]-vs[j]+vs[i]));
			
			f[i][j][1]=max(f[i][j-1][0]+a[j].y-(ll)(a[j].x-a[i].x)*(vs[n]-vs[j-1]+vs[i-1]),
						f[i][j-1][1]+a[j].y-(ll)(a[j].x-a[j-1].x)*(vs[n]-vs[j-1]+vs[i-1])); 
		}
	}
	printf("%.3lf\n",max(f[1][n][0],f[1][n][1])/1000.0);
	return 0;
}

标签:Sue,SDOI2008,int,小球,long,times,vs,include
From: https://www.cnblogs.com/Unlimited-Chan/p/16732787.html

相关文章

  • 3rd 2022/5/9 题目总结·数论篇·欧拉函数·【SDOI2008】仪仗队
    原题作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N*N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的生后方,根据其视线所及的学生人数......
  • 题解【P2466 [SDOI2008] Sue 的小球】
    题目传送门。一眼丁真,鉴定为原题。现将所有点按照\(x\)排序,区间\([l,r]\)的终点一定是\(l\)或\(r\),否则会跑冤枉路。设\(f_{i,j,0/1}\)表示在区间\([i,j]\)......
  • 加入购物车抛小球和购物车晃动
    抛出小球加到地方对应元素晃动(加入购物车动画)/****横向抛小球到购物车*@paramaddBtnDom增加按钮的dom元素或者选择器,初始位置*@paramshopCarDom购物车的d......
  • N个箱子放入K个小球的方案数
    https://zhidao.baidu.com/question/367173891541492052.html结果为C(N+K-1,K)思想为上面的挨个放入。或者将每个箱子都先放入一个球,即N个箱子,放入N+K个小球,箱子非空,然......