【清北学堂2018-刷题冲刺】Contest 5
这三个题写了一天半,第一个题写了大概一整天。出题人劝我从后往前写,我不听,结果T1想了+调了一天QWQWQ
Task 1:序列
【问题描述】
定义一个“好的序列”为一个长度为M的不下降序列,且序列中的元素均为1-N的正整数。现在我们随机生成一个“好的序列”,每个不同的“好的序列”出现的概率相同,求这个序列中众数的出现次数的期望。
【输入】
输入文件含有多组数据
每组数据读入一行两个整数M、N。
【输出】
对于每组测试数据,输出一行一个实数表示答案,精确到小数点后4位。
【输入输出样例】
1 5
2 9
3 3
1.0000
1.2000
2.2000
【样例解释】
令x表示序列中众数的出现次数。
当M = 3,N = 3时可能的序列有:
1 1 1(x=3) 1 1 2(x=2) 1 1 3(x=2)
1 2 2(x=2) 1 2 3(x=1) 1 3 3(x=2)
2 2 2(x=3) 2 2 3(x=2) 2 3 3(x=2)
3 3 3(x=3)
因此x的期望为2.2。
【数据范围】
1 ≤ M≤ 250,1 ≤ N ≤ 10^9
每个点的总数据组数不会超过15组。
【提示】
题目难度与题目顺序无关。
请注意精度问题。
关键难点在于如何构建状态。
这里我们设sum[ k ][ i ][ j ]为众数个数为[ 1 , k ],数列长度为i,选用元素为j的情况数量之和。
这样设定的好处,看下面很快就会明白:
- 对于数列本身,我们有这样的划分:
- 对于某个特定长度的数列,我们考虑把它离散化处理。
成多块,每块由相同元素组成,一共ki[ 1 , m ]块。- 在n个元素中选出k个填入这些块中,离散化的结果和数列本身效果一致,根据乘法原理,直接把可以选的个数C(n,k)与最终答案对应相乘即可。
- 为了处理答案,我们维护一个前缀和:众数个数<=k的情况下序列总个数的和
- 为什么维护前缀和而不是单独求本身某一个?因为求和制约条件更宽松,容易推导和判断。
- 在n个元素中选出k个填入这些块中,离散化的结果和数列本身效果一致,根据乘法原理,直接把可以选的个数C(n,k)与最终答案对应相乘即可。
- 对于某个特定长度的数列,我们考虑把它离散化处理。
更新时,累加前面两种情况:
上一个选择的元素是最新的元素
上一个选择的元素不是最新元素
需要判重的情况:
众数个数超过k个的话。
如果同一个元素在这里累积了k+1次,就应该去掉。
所以转移方程就可以得到了:
sum[ k ][ i ][ j ]=sum[ k ][ i - 1 ][ j - 1 ]+sum[ k ][ i - 1 ][ j ];
if( k < i )sum[ k ][ i ][ j ]-=sum[ k ][ i - k - 1 ][ j - 1 ];
为了保证答案精度,这里使用long double。
组合数的计算:这里我选择线性递推法.
由于数据有15组之多,我们选择先进行不同长度情况的预处理,对于不同的可选元素个数只需要搞个组合数上去就可以了。
复杂度:O(n^3)
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int T,m,n;
long double C[255],sum[255][255][255],f[255][255][255],g[255];
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
C[0]=true;
for(register int k=1;k<=251;++k){
sum[k][0][0]=1;
for(register int i=1;i<=251;++i){
for(register int j=1;j<=i;++j){
//i->序列长度 j->总共使用的元素个数 k->众数的个数
//sum存储的就是在当前的众数个数的情况下,可以构造出来的序列个数。
//由于是一步一步递推得到,可以直接适用于所有m∈[1,251]的情况。
sum[k][i][j]=sum[k][i-1][j-1]+sum[k][i-1][j];
//这里维护的是一个前缀和:求的是众数个数为k情况下序列总个数的和
//更新时,累加前面两种情况:
//->上一个选择的元素是最新的元素
//->上一个选择的元素不是最新元素
if(k<i){
sum[k][i][j]-=sum[k][i-k-1][j-1];
//需要判重的情况:众数个数超过k个的话。
//等效于->如果同一个元素在这里累积了k+1次,就应该去掉。
}
}
}
}
while(cin>>m>>n){
memset(g,0,sizeof(g));
for(register int i=1;i<=m;++i){
C[i]=C[i-1]*(n-i+1)/i;
}//O(m)递推求组合数
for(register int k=1;k<=m;++k){
for(register int j=1;j<=m;++j){
g[k]+=sum[k][m][j]*C[j];
}//计数求和。
}
long double ans=0;
//g表示的是总共可能出现的情况种类数,是累加
for(register int k=1;k<=m;++k){
ans+=k*(g[k]-g[k-1])/g[m];
} //给出答案
printf("%.4Lf\n",(double)ans);
}
return 0;
}
T1相当有难度,但T2T3都是大水题。
Task 2:游戏
【问题描述】
小H喜欢玩游戏。她会首先选择一个数
【清北学堂2018-刷题冲刺】Contest 5的更多相关文章
- 2017 清北济南考前刷题Day 7 afternoon
期望得分:100+100+30=230 实际得分:100+100+30=230 1. 三向城 题目描述 三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口.(来自取名力为0的 ...
- 2017 清北济南考前刷题Day 1 afternoon
期望得分:80+30+70=180 实际得分:10+30+70=110 T1 水题(water) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK出了道水 ...
- 2017 清北济南考前刷题Day 3 morning
实际得分:100+0+0=100 T1 右上角是必败态,然后推下去 发现同行全是必胜态或全是必败态,不同行必胜必败交叉 列同行 所以n,m 只要有一个是偶数,先手必胜 #include<cstd ...
- 2017 清北济南考前刷题Day 3 afternoon
期望得分:100+40+100=240 实际得分:100+40+100=240 将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 ,那么无解 如果边数=点数,那么贡献是 2 如果边数 ...
- 2017 清北济南考前刷题Day 4 afternoon
期望得分:30+50+30=110 实际得分:40+0+0=40 并查集合并再次写炸... 模拟更相减损术的过程 更相减损术,差一定比被减数小,当被减数=减数时,停止 对于同一个减数来说,会被减 第1 ...
- 2017 清北济南考前刷题Day 7 morning
期望得分:100+50+20=170 实际得分:10+50+20=80 1. 纸牌 题目描述 在桌面上放着n张纸牌,每张纸牌有两面,每面都写着一个非负整数.你的邪王真眼可以看到所有牌朝上的一面和朝下的 ...
- 2017 清北济南考前刷题Day 6 afternoon
期望得分:100+100+30=230 实际得分: 正解: 枚举最高的位,这一位m是1但实际用了0 然后剩余的低位肯定是 正数就用1,负数用0 考场思路:数位DP #include<cstdio ...
- 2017 清北济南考前刷题Day 6 morning
T1 贪心 10 元先找5元 20元 先找10+5,再找3张5 #include<cstdio> using namespace std; int m5,m10,m20; int main ...
- 2017 清北济南考前刷题Day 5 afternoon
期望得分:100+100+30=230 实际得分:0+0+0=30 T1 直接模拟 #include<cstdio> #include<iostream> using name ...
- 2017 清北济南考前刷题Day 5 morning
期望得分:100+100+0=200 实际得分: 坐标的每一位不是0就是1,所以答案就是 C(n,k) #include<cstdio> #include<iostream> ...
随机推荐
- hdu 4578 Transformation 线段树多种操作裸题
自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...
- DRF 版本和认证
Django Rest Framework 版本控制组件 DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们 ...
- Elasticsearch 删除数据
删除数据分为两种:一种是删除索引(数据和表结构同时删除,作用同SQLSERVER 中 DROP TABLE "表格名" ),另一种是删除数据(不删除表结构,作用同SQLSERVER ...
- 学习Android过程中遇到的问题及解决方法——AS为xutils添加依赖
在使用xutils时遇到不能添加以来的问题,花了很长时间终于解决,网上添加依赖的方法很多,在此针对个人出现的问题作下笔记. 我本想使用jar包,因为在使用smartImageView时是用的jar包来 ...
- bzoj 1854: [Scoi2010]游戏 (并查集||二分图最大匹配)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1854 写法1: 二分图最大匹配 思路: 将武器的属性对武器编号建边,因为只有10000种 ...
- virtualenv virtualenvwrapper 虚拟环境创建
虚拟环境创建 安装 C:\Users\Python> pip install virtualenv Requirement already satisfied: virtualenv ) C:\ ...
- pytorch kaggle 泰坦尼克生存预测
也不知道对不对,就凭着自己的思路写了一个 数据集:https://www.kaggle.com/c/titanic/data import torch import torch.nn as nn im ...
- 【HDU - 4342】History repeat itself(数学)
BUPT2017 wintertraining(15) #8C 题意 求第n(n<2^32)个非完全平方数m,以及\(\sum_{i=1}^m{\lfloor\sqrt i\rfloor}\) ...
- Android GPS定位测试(附效果图)
今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整 ...
- 【BZOJ2817】[ZJOI2012]波浪(动态规划)
[BZOJ2817][ZJOI2012]波浪(动态规划) 题面 BZOJ 洛谷 题解 首先这个差值最大也就是\(n^2\)级别的. 那么这样子就可以压进状态啦. 我们把这个操作看成一个个加数的操作,按 ...
期望得分:100+100+30=230 实际得分:100+100+30=230 1. 三向城 题目描述 三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口.(来自取名力为0的 ...
期望得分:80+30+70=180 实际得分:10+30+70=110 T1 水题(water) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK出了道水 ...
实际得分:100+0+0=100 T1 右上角是必败态,然后推下去 发现同行全是必胜态或全是必败态,不同行必胜必败交叉 列同行 所以n,m 只要有一个是偶数,先手必胜 #include<cstd ...
期望得分:100+40+100=240 实际得分:100+40+100=240 将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 ,那么无解 如果边数=点数,那么贡献是 2 如果边数 ...
期望得分:30+50+30=110 实际得分:40+0+0=40 并查集合并再次写炸... 模拟更相减损术的过程 更相减损术,差一定比被减数小,当被减数=减数时,停止 对于同一个减数来说,会被减 第1 ...
期望得分:100+50+20=170 实际得分:10+50+20=80 1. 纸牌 题目描述 在桌面上放着n张纸牌,每张纸牌有两面,每面都写着一个非负整数.你的邪王真眼可以看到所有牌朝上的一面和朝下的 ...
期望得分:100+100+30=230 实际得分: 正解: 枚举最高的位,这一位m是1但实际用了0 然后剩余的低位肯定是 正数就用1,负数用0 考场思路:数位DP #include<cstdio ...
T1 贪心 10 元先找5元 20元 先找10+5,再找3张5 #include<cstdio> using namespace std; int m5,m10,m20; int main ...
期望得分:100+100+30=230 实际得分:0+0+0=30 T1 直接模拟 #include<cstdio> #include<iostream> using name ...
期望得分:100+100+0=200 实际得分: 坐标的每一位不是0就是1,所以答案就是 C(n,k) #include<cstdio> #include<iostream> ...
自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...
Django Rest Framework 版本控制组件 DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们 ...
删除数据分为两种:一种是删除索引(数据和表结构同时删除,作用同SQLSERVER 中 DROP TABLE "表格名" ),另一种是删除数据(不删除表结构,作用同SQLSERVER ...
在使用xutils时遇到不能添加以来的问题,花了很长时间终于解决,网上添加依赖的方法很多,在此针对个人出现的问题作下笔记. 我本想使用jar包,因为在使用smartImageView时是用的jar包来 ...
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1854 写法1: 二分图最大匹配 思路: 将武器的属性对武器编号建边,因为只有10000种 ...
虚拟环境创建 安装 C:\Users\Python> pip install virtualenv Requirement already satisfied: virtualenv ) C:\ ...
也不知道对不对,就凭着自己的思路写了一个 数据集:https://www.kaggle.com/c/titanic/data import torch import torch.nn as nn im ...
BUPT2017 wintertraining(15) #8C 题意 求第n(n<2^32)个非完全平方数m,以及\(\sum_{i=1}^m{\lfloor\sqrt i\rfloor}\) ...
今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整 ...
[BZOJ2817][ZJOI2012]波浪(动态规划) 题面 BZOJ 洛谷 题解 首先这个差值最大也就是\(n^2\)级别的. 那么这样子就可以压进状态啦. 我们把这个操作看成一个个加数的操作,按 ...