清北集训Day1T3 LYK loves jumping(期望DP)
时间:2022-05-07
本文章向大家介绍清北集训Day1T3 LYK loves jumping(期望DP),主要内容包括题目描述、输入输出格式、输入输出样例、说明、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目描述
LYK在玩一个魔法游戏,叫做跳跃魔法。 有n个点,每个点有两个属性hi和ti,表示初始高度,和下降高度。也就是说,它初始时高度为hi,一旦LYK踩在这个点上,由于重力的影响,这个点的高度会下降ti,当LYK离开这个点时,这个点的高度又会回到hi。 众所周知的是,跳跃游戏一般是往下跳的,每次LYK可以从一个点跳到任意一个高度不超过它的点,也就是说,当ti=0时,它可以跳到自己本来所在的点。 当没地方可以跳的时候,LYK就会跳到地面,现在LYK想以第i个点为起点,问期望跳多少次能跳到地面。当然i可以是1~n中的任意一个数字。 若期望步数为无穷,输出0.000。 设oo表示无穷大,X为一个数,有oo-X=oo,oo*X=oo,oo/X=oo,oo+X=oo。
输入输出格式
输入格式:
第一行输入一个数n,表示有n个点。 第二行输入n个数,表示hi。 第三行输入n个数,表示ti。
输出格式:
输出一行n个数,表示以当前点为起点时,期望跳几次跳到地面(保留4位小数),若期望次数为无穷,输出“0.0000”。
输入输出样例
输入样例#1: 复制
4
4 2 2 3
0 1 0 0
输出样例#1: 复制
3.8333 1.0000 3.0000 3.5000
说明
对于20%的数据n<=5。 对于另外20%的数据所有hi都相等。 对于再另外20%的数据不存在ti=0。 对于再再另外20%的数据hi都互不相等。 对于100%的数据1<=n,hi<=10^5,0<=ti<=hi。
一道并不难的期望dp
推出样例就相当于做完一半了
对于一个点,分t=0和t!=0两种情况讨论
然后拿个树状数组维护一下就好了
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=1e6+10;
const double INF=1e16;
#define lb(x) (x&(-x))
inline int read()
{
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int N;
struct node
{
int h,t,ID;
double ans;
bool operator < (const node &a) const
{
return a.h==h?t>a.t:h<a.h;
}
}a[MAXN],now;
int comp(const node &a,const node &b)
{
return a.ID<b.ID;
}
namespace BIT
{
double T[MAXN];
void PointChange(int pos,double val)
{
while(pos<=N)
{
T[pos]+=val;
pos+=lb(pos);
}
}
double Sum(int pos)
{
double ans=0;
while(pos) ans+=T[pos],pos-=lb(pos);
return ans;
}
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#endif
N=read();
for(int i=1;i<=N;i++) a[i].h=read();
for(int i=1;i<=N;i++) a[i].t=read(),a[i].ID=i;
sort(a+1,a+N+1);
for(int i=1;i<=N;i++)
{
now.h=a[i].h-a[i].t;
if(a[i].t)
{
int posmax=upper_bound(a+1,a+N+1,now)-a-1;
if(posmax) a[i].ans=BIT::Sum(posmax)/posmax+1;
else a[i].ans=1;
}
else
{
int posmin=lower_bound(a+1,a+N+1,now)-a-1;
int posmax=upper_bound(a+1,a+N+1,now)-a-1;
a[i].ans=(double)(posmax+BIT::Sum(posmin))/posmin;
}
BIT::PointChange(i,a[i].ans);
}
sort(a+1,a+N+1,comp);
for(int i=1;i<=N;i++)
{
if(a[i].ans>=-INF&&a[i].ans<=INF)
printf("%.4lf ",a[i].ans);
else printf("0.0000 ");
}
return 0;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- DietPi配置问题(2)
- 什么是死锁?如何解决死锁?
- Mac终端配置oh-my-zsh
- 聊聊dubbo-go的leastActiveLoadBalance
- ThreadLocal与InheritableThreadLocal
- 每天学点JavaScript基础(1)—— null 和 undefined
- 每天学点JavaScript基础(2)——JavaScript里的分号,你加还是不加?
- Flutter中async与await异步编程原理分析
- 在树莓派上使用360WIFI
- Orange PI Zero OpenWrt固件
- 定制用于日常使用的树莓派系统
- adb网络调试重启后不关闭得方法
- Mac版VsCode不能主动更新问题
- TensorFlow安装
- AQS原理分析