尽管是一道E题,但真心并不很难~不难发现,有一些物品是一定要被选择的,我们所需要决策的仅仅只有那几个有重复价值的物品。

  而不同名字之间的概率并不互相影响,所以我们有 \(f[i][j]\) 表示名字为 \(i\) 的物品呼唤 \(j\) 次恰好获得前 \(j\) 大的价值的物品的概率。转移方程为:

 \(f[i][j] = f[i][j - 1] * j * \frac{1}{a[i][0]−j+1}\)

为什么要\(*j\) 呢?因为这第 \(j\) 个物品的排列顺序并不是固定的。

  要把这 \(n\) 个物品结合起来,我们可以再建立一个 dp 数组,\(g[i][[j]\) 表示前 \(i\) 个名字中,呼唤得到恰好 \(j\) 个有重复价值的物品。我们有转移方程:

 \(g[i][j] = \sum g[i - 1][j - 1] * f[i][rec[j] +1]\)

与 \(g[i][j] = \sum g[i - 1][j] * f[i][rec[i]]\)

以上两个分别表示当前名字是否呼唤到一个重复价值的物品。

  有没有感觉到有什么不对?没错,在计算的时候,我们的 \(f[i][k]\) 前面是没有带系数的,也就是我们并没有去统计以这样的方式去呼唤的概率是多少。但题目中明确说明当有几种可能呼唤到最高价值的物品时,我们会等概率的任选一种。所以我们可以考虑算出总的方案数 \(c[i][j]\) ,然后再除去这个方案数,即 \(ans =\frac{g[m][cnt]}{c[m][cnt]}\)。这个的转移很简单,可以看一下代码。表面 \(n ^{3}\) ,但第二维的枚举总数限定了范围,所以完全可以承受。

  不过我也很好奇……为什么 \(c[i][j]\) 一定要开 double 类型呢?不开就WA了……求解释呀,有知道的还请回复我,私信也可以呀!感激不尽QAQ

#include <bits/stdc++.h>
using namespace std;
#define maxn 2500
#define db long double
int n, m, tot, cnt, rec[maxn];
int a[maxn][maxn], b[maxn];
db f[maxn][maxn], g[maxn][maxn], c[maxn][maxn]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} bool cmp(int x, int y) { return x > y; }
void Up(db &x, db y) { x = x + y; } int main()
{
n = read(), m = read();
for(int i = ; i <= m; i ++)
{
a[i][] = read();
for(int j = ; j <= a[i][]; j ++)
a[i][j] = read(), b[++ tot] = a[i][j];
sort(a[i] + , a[i] + + a[i][], cmp);
}
sort(b + , b + + tot, cmp);
for(int i = n; i; i --)
if(b[i] == b[i - ]) cnt ++;
else break;
cnt += ; int K = b[n]; c[][] = ;
for(int i = ; i <= m; i ++)
{
f[i][] = ;
for(int j = ; j <= a[i][]; j ++)
{
if(a[i][j] < K) break;
if(a[i][j] > K) rec[i] = j;
f[i][j] = (db) f[i][j - ] * (db) j * ((db) / (db) (a[i][] - j + ));
}
}
for(int i = , tem = , up = ; i <= m; i ++)
{
int r1 = ;
for(int j = ; j <= up; j ++) c[i][j] = c[i - ][j];
for(int j = rec[i] + ; j <= a[i][]; j ++)
{
if(a[i][j] < K) break;
int t = j - rec[i]; r1 ++;
for(int k = ; k <= up; k ++)
c[i][k + t] = (c[i][k + t] + c[i - ][k]);
}
up += r1;
}
g[][] = ;
for(int i = ; i <= m; i ++)
for(int j = ; j <= cnt; j ++)
{
if(j) Up(g[i][j], g[i - ][j - ] * f[i][rec[i] + ]);
Up(g[i][j], g[i - ][j] * f[i][rec[i]]);
}
cout << fixed << setprecision() << (g[m][cnt] / (db) c[m][cnt]) << endl;
return ;
}

【题解】CF#229 E-Gifts的更多相关文章

  1. 竞赛题解 - CF Round #524 Div.2

    CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...

  2. 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T5(思维)

    还是dfs? 好像自己写的有锅 过不去 看了题解修改了才过qwq #include <cstdio> #include <algorithm> #include <cst ...

  3. 竞赛题解 - [CF 1080D]Olya and magical square

    Olya and magical square - 竞赛题解 借鉴了一下神犇tly的博客QwQ(还是打一下广告) 终于弄懂了 Codeforces 传送门 『题目』(直接上翻译了) 给一个边长为 \( ...

  4. [题解] [CF 1250J] The Parade

    题面 题目大意: 给定一个 \(n\) , 所有军人的数量均在 \([1, n]\) 给定 \(a_i\) 代表高度为 \(i\) 的军人的个数 你要将这些军人分成 \(k\) 行, 满足下面两个条件 ...

  5. 题解 CF 1372 B

    题目 传送门 题意 给出 \(n\),输出 \(a\) ,\(b\) (\(0 < a \leq b < n\)),使\(a+b=n\)且 \(\operatorname{lcm}(a,b ...

  6. 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T4(模拟)

    随便模拟下就过了qwq 然后忘了特判WA了QwQ #include <cstdio> #include <algorithm> #include <cstring> ...

  7. 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T3(贪心)

    是一道水题 虽然看起来像是DP,但其实是贪心 扫一遍就A了 QwQ #include <cstdio> #include <algorithm> #include <cs ...

  8. 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T2(模拟)

    题目要求很简单,做法很粗暴 直接扫一遍即可 注意结果会爆int #include <cstdio> #include <algorithm> #include <cstr ...

  9. 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T1(找规律)

    就是找一下规律 但是奈何昨天晚上脑子抽 推错了一项QwQ 然后重新一想 A掉了QwQ #include <cstdio> #include <algorithm> #inclu ...

随机推荐

  1. LeetCode:39. Combination Sum(Medium)

    1. 原题链接 https://leetcode.com/problems/combination-sum/description/ 2. 题目要求 给定一个整型数组candidates[ ]和目标值 ...

  2. springboot与activemq的使用

    1.springboot和activemq的使用相对来说比较方便了,我在网上看了很多其他的资料,但是自己写出来总是有点问题所以,这里重点描述一下遇到的一些问题. 2.至于activemq的搭建和spr ...

  3. 友晶Altera Cyclone V GX Starter Kit开发板使用ADC-第一篇

    1. 拿到板子在,做工很好,属于GX系列,GX应该是高速收发器 2. 去探究下GX是什么用途,大约有6个型号,这个板子是5CGXFX5,有77 LE逻辑单元,这个收发器不知道是什么?6个 3.125G ...

  4. nodejs HTTP服务

    nodejs中的HTTP服务   nodejs最重要的方面之一是具有非常迅速的实现HTTP和HTTPS服务器和服务的能力.http服务是相当低层次的,你可能要用到不同的模块,如express来实现完整 ...

  5. 使用 adb 命令一次性为多个设备安装 apk

    使用 adb 命令一次性为多个设备安装 apk 原创 2016年07月15日 10:40:53 3154 命令简介 adb install [-lrtsdg] (file) 把包文件推送到设备上并安装 ...

  6. centos下testlink的部署(基于xampp)

    1. sudu -i 切换root用户      cd /opt切换到opt目录下(在linux下默认的下载文件目录在opt下) 执行命令下载xampp:      https://sourcefor ...

  7. 【springmvc+mybatis项目实战】杰信商贸-1.项目背景

    1.项目背景杰信项目物流行业的项目,杰信商贸是国际物流行业一家专门从事进出口玻璃器皿贸易的公司.公司总部位于十一个朝代的帝王之都西安,业务遍及欧美.随着公司不断发展壮大,旧的信息系统已无法满足公司的快 ...

  8. 爬虫1.5-ajax数据爬取

    目录 爬虫-ajax数据爬取 1. ajax数据 2. selenium+chromedriver知识准备 3. selenium+chromedriver实战拉勾网爬虫代码 爬虫-ajax数据爬取 ...

  9. PNG和PVR之间互相转换的脚本

    项目经常会将png和pvr之间互相转换,这里mark一个脚本,会将当前目录下的文件全部批量转换 png转换成pvr @echo off path %path%;"C:\Program Fil ...

  10. [ Continuously Update ] The Paper List of Image / Video Captioning

    Papers Published in 2018 Convolutional Image Captioning - Jyoti Aneja et al., CVPR 2018 - [ Paper Re ...