【题解】CF#229 E-Gifts
尽管是一道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的更多相关文章
- 竞赛题解 - CF Round #524 Div.2
CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T5(思维)
还是dfs? 好像自己写的有锅 过不去 看了题解修改了才过qwq #include <cstdio> #include <algorithm> #include <cst ...
- 竞赛题解 - [CF 1080D]Olya and magical square
Olya and magical square - 竞赛题解 借鉴了一下神犇tly的博客QwQ(还是打一下广告) 终于弄懂了 Codeforces 传送门 『题目』(直接上翻译了) 给一个边长为 \( ...
- [题解] [CF 1250J] The Parade
题面 题目大意: 给定一个 \(n\) , 所有军人的数量均在 \([1, n]\) 给定 \(a_i\) 代表高度为 \(i\) 的军人的个数 你要将这些军人分成 \(k\) 行, 满足下面两个条件 ...
- 题解 CF 1372 B
题目 传送门 题意 给出 \(n\),输出 \(a\) ,\(b\) (\(0 < a \leq b < n\)),使\(a+b=n\)且 \(\operatorname{lcm}(a,b ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T4(模拟)
随便模拟下就过了qwq 然后忘了特判WA了QwQ #include <cstdio> #include <algorithm> #include <cstring> ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T3(贪心)
是一道水题 虽然看起来像是DP,但其实是贪心 扫一遍就A了 QwQ #include <cstdio> #include <algorithm> #include <cs ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T2(模拟)
题目要求很简单,做法很粗暴 直接扫一遍即可 注意结果会爆int #include <cstdio> #include <algorithm> #include <cstr ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T1(找规律)
就是找一下规律 但是奈何昨天晚上脑子抽 推错了一项QwQ 然后重新一想 A掉了QwQ #include <cstdio> #include <algorithm> #inclu ...
随机推荐
- 微信小程序学习笔记(1)- 按钮触发的函数的定义以及不同页面之间的数据传递
<view class='item' bindtap='onCountryTab' data-idx='4'> 1)bindtap属性用来设置控件需要绑定的函数,函数用单引号括起来:. 2 ...
- Mate20兼容性如何?WeTest带你抢先测!
自从九月份 iPhone XS 系列发布后,WeTest团队迅速入库了iPhone XS和iPhone XR设备,十月份国内巨头华为也重磅推出了一款“Mate 20”设备,让下半年的国内手机市场又热闹 ...
- javaweb(六)——Servlet开发(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频
最近发现一些网站,可以解析各大视频网站的vip.仔细想了想,这也算是爬虫呀,爬的是视频数据. 首先选取一个视频网站,我选的是 影视大全 ,然后选择上映不久的电影 “一出好戏” . 分析页面 我用的是c ...
- 学习用MaxScipt批处理Max文件
学习用MaxScipt批处理Max文件 需求 对几百个.max文件中的指定指定名称的骨骼进行重命名. 解决 考虑到是一次性需求,花了两个钟用maxscript实现了功能,基本逻辑把改名规则做成配置文本 ...
- AngularJS 初探
AngularJS,诞生于2009年,由Misko Hevery等人创建,后为Google所收购.这是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为 ...
- SGU 176 Flow construction(有源汇上下界最小流)
Description 176. Flow construction time limit per test: 1 sec. memory limit per test: 4096 KB input: ...
- defineporperty 的使用 设置对象的只读或只写属性
<!DOCTYPE html> <html lang="en"> <head> <title>Document</title& ...
- Switches and Lamps(思维)
You are given n switches and m lamps. The i-th switch turns on some subset of the lamps. This inform ...
- Java 集合框架之Collection
此图是 java 中 Collection 相关的接口与类的关系的类图.其中,类只是集合框架的一部分,比较常用的一部分. 第一次画类图,着实很费劲,不过收获也不小. 下面是相关接口和类的解释说明.文字 ...