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的更多相关文章

  1. CodeForces 698C LRU

    吐槽一句:这数据造得真强-. 题意:有一个大小为k的缓存区,每次从n种物品中按照一定的概率选取一种物品尝试放进去.同一个物品每一次选取的概率都是相同的.如果这种物品已经放进去过就不再放进去.如果缓存区 ...

  2. ●CodeForces 698C LRU

    题链: http://codeforces.com/problemset/problem/698/C题解.1: 概率dp,状压dp 棒棒哒题解:https://www.cnblogs.com/liu- ...

  3. 【codeforces 698C】LRU

    题目链接: http://codeforces.com/problemset/problem/698/C 题目大意: n个物品,k个格子,第i个物品每次被选取的概率为$p_{i}$,如果格子里没有该物 ...

  4. gerrit配置和使用

    参考http://www.cnblogs.com/tesky0125/p/5973642.html 1.安装gerrit replication插件 mkdir ~/tmp cp gerrit-2.1 ...

随机推荐

  1. 去面试Python工程师,这几个基础问题一定要能回答,Python面试题No4

    今天的面试题以基础为主,去面试Python工程师,这几个基础问题不能答错 第1题:列表和元组有什么不同? 列表和元组是Python中最常用的两种数据结构,字典是第三种. 相同点: 都是序列 都可以存储 ...

  2. (十四)Python3 字符串格式化

    Python3 字符串格式化 字符串的格式化方法分为两种,分别为占位符(%)和format方式.占位符方式在Python2.x中用的比较广泛,随着Python3.x的使用越来越广,format方式使用 ...

  3. UvaLive 4872 Underground Cables (最小生成树)

    题意: 就是裸的最小生成树(MST), 完全图, 边长是实数. 分析: 算是复习一下MST把 方法一: prim 复杂度(n^2) #include <bits/stdc++.h> usi ...

  4. JSONArray 遍历方式

    第一种(java8):遍历JSONArray 拼接字符串 public static void main(String[] args) { JSONArray jSONArray = new JSON ...

  5. js在HTML中的三种写法

    1.内联样式 内联样式分为两种,一是直接写入元素的标签内部 <html> <title>js样式内联写法</title> <meta http-equiv=& ...

  6. css3 & background & background-image

    css3 & background & background-image https://developer.mozilla.org/en-US/docs/Web/CSS/backgr ...

  7. JS基础:正则表达式

    简介 正则表达式 (regular expression) 描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串.将匹配的子串做替换或者从某个字符串中取出符合某个条件的子串等.在 JS ...

  8. [K/3Cloud] 创建一个单据转换插件

    概念: 创建一个业务单据转换插件,在单据转换的各个时点干预单据转换的相关逻辑控制. 示例: 新建一个类,继承自单据转换插件基类Kingdee.BOS.Core.Metadata.ConvertElem ...

  9. POJ3669 Meteor Shower

    http://poj.org/problem?id=3669 类似于迷宫的一道题 但是并没有 给出迷宫具体什么样 但是题目已说在坐标轴的第一象限 然后障碍就是 流星雨所砸范围 安全位置:永远不会发生危 ...

  10. php框架之自动加载与统一入口

    现在PHP有很多的框架,基本都是以MVC为基础进行设计的.其实很多框架(像thinkphp,zf,symfont等)都有两个特性,自动加载类文件和统一入口.这里就简单实现以上两个特性. 假设PHP使用 ...