698C
Description
n个视频,长度为k的缓存,每次询问,每个视频以pi的概率被选,如果不在缓存区则加入,如果缓存区满了,则最先进缓存的出来,问10^100次操作以后每个视频在缓存的概率
Input
第一行两个整数n和k,第二行n个数表示每个视频被选中的概率
(1<=k<=n<=20,0<=pi<=1,sum(pi)=1)
Output
输出10^100次操作后每个视频在缓存中出现的概率
Sample Input
3 1
0.3 0.2 0.5
Sample Output
0.3 0.2 0.5
10^100次方说明这个缓存肯定是填满了,那么也就是说只有最后几个操作可以影响到缓存中存在东西的概率 那么问题就转化成了装满缓存后每个物品存在的概率 就是说只要我加满了k 就停止。那么这个东西我们可以装压dp dp[i]表示i集合出现的概率。那么怎么转移呢?dp[i | 1 << j] = dp[i] * p[j] / sum (sum = sigma(p[k]), k不属于i, j属于i) 为什么呢 因为如果缓存中已经存在了某些东西,那么我们加进去是无效的,又因为我们加了很多次,那么这些无效的操作可以忽视(不是很懂,自己yy的)所以我们要除去选中缓存中已有物品的概率,剩下的概率就是从没选中的东西中选j的概率。那么这个dp就很好理解了。统计答案时如果这个集合的元素个数=k那么每个元素出现的概率加上这个dp值 还需要注意几点,1.sum不能很小; 2.如果p=0 那么这个物品肯定不会选中,所以我们先统计一下p不等于0的元素,和k比较一下谁更小,更小的作为k。
想想这还是我第一次打cf的题目呢,当时觉得这是什么东西,现在好像有了一些的进步。
#include<bits/stdc++.h>
using namespace std;
const int N = ;
const double eps = 1e-;
int n, k, all;
double dp[ << N], p[N], ans[N];
inline double getsum(int x)
{
double ret = ;
for(int i = ; i < n; ++i) if(x & ( << i)) ret += p[i];
return - ret;
}
int main()
{
scanf("%d%d", &n, &k); all = << n; int m = ;
for(int i = ; i < n; ++i)
{
scanf("%lf", &p[i]);
if(fabs(p[i]) > eps) ++m;
}
k = min(k, m);
dp[] = ;
for(int i = ; i < all; ++i)
{
double sum = getsum(i);
for(int j = ; j < n; ++j) if(!(i & ( << j)))
dp[i | ( << j)] += dp[i] * p[j] / sum;
}
for(int i = ; i < all; ++i) if(__builtin_popcount(i) == k)
for(int j = ; j < n; ++j) if(i & ( << j)) ans[j] += dp[i];
for(int i = ; i < n; ++i) printf("%.7f ", ans[i]);
return ;
}
698C的更多相关文章
- CodeForces 698C LRU
吐槽一句:这数据造得真强-. 题意:有一个大小为k的缓存区,每次从n种物品中按照一定的概率选取一种物品尝试放进去.同一个物品每一次选取的概率都是相同的.如果这种物品已经放进去过就不再放进去.如果缓存区 ...
- ●CodeForces 698C LRU
题链: http://codeforces.com/problemset/problem/698/C题解.1: 概率dp,状压dp 棒棒哒题解:https://www.cnblogs.com/liu- ...
- 【codeforces 698C】LRU
题目链接: http://codeforces.com/problemset/problem/698/C 题目大意: n个物品,k个格子,第i个物品每次被选取的概率为$p_{i}$,如果格子里没有该物 ...
- gerrit配置和使用
参考http://www.cnblogs.com/tesky0125/p/5973642.html 1.安装gerrit replication插件 mkdir ~/tmp cp gerrit-2.1 ...
随机推荐
- UvaLive 4863 Balloons(贪心)
题意: 给定n个队伍, 然后A房间有a个气球, B房间有b个气球, 然后给出每个队伍所需要的气球数量和到A B房间的距离, 求把气球全部送到每个队伍的最短距离. 分析: 在气球充足的情况下, 那么我们 ...
- JavaEE JDBC 了解JNDI
了解JNDI @author ixenos Web与企业应用中的连接管理 1. 数据库连接方式: (1)使用配置文件 (2)使用JNDI 2. 在Web或企业环境中部署 JDBC应用时,数据库连接管理 ...
- MySQL-Transfer2.2发布
http://dinglin.iteye.com/blog/1888640 Transfer 2.2发布.下载地址 版本说明 1. 基于版本 Percona-5.5.31 ,简单用法是先安装好官方或 ...
- Django开发:(3.1)ORM:单表操作
MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需 ...
- [ 浙江大学 程序设计专题 ] 四个专题代码 报告 PPT共享
[原创]转载请注明出处,请勿用于作弊 专题一: 链接: https://pan.baidu.com/s/11xCwvuPHDkTPeOB_yzJWnw 提取码: prup 专题二: 链接: https ...
- 听dalao讲课 7.26
XFZ今天讲了些关于多项式求ln和多项式求导以及多项式求积分的东西 作为一个连导数和积分根本就不会的蒟蒻,就像在听天书,所以不得不补点前置知识 1.积分 积分是微积分学与数学分析里的一个核心概念.通常 ...
- 【ZJOI2017 Round1练习&BZOJ4773】D3T1 cycle(最小负环,倍增)
题意:给定一个带权有向图,求点数最小的负环. 2 ⩽ n ⩽ 3000 ⩽ m ⩽ n(n - 1)1 ⩽ ui,vi ⩽ nabs(w[j])<= 10^4 思路:倍增思想 设d[i,j,k] ...
- Thinkphp5.0 的实践一
Thinkphp5.0 的实践一 tp5.0默认没有__SELF__,需要定义, define('__SELF__',strip_tags($_SERVER['REQUEST_URI'])); tp5 ...
- Java发送邮件示例
利用Java发送邮件示例: 1.发送QQ邮件 import java.util.Properties; import javax.mail.Message; import javax.mail.Mes ...
- 关于warning
IT男正吸着雪茄,吐着烟圈.他女朋友生气了发飙道:“你没看见包装盒上的警告(Warning)么?吸烟有害健康!” IT男淡定地回答道:“我是程序员.我们不关心警告,只关心错误.”