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 = 23;
const double eps = 1e-6;
int n, k, all;
double dp[1 << N], p[N], ans[N];
inline double getsum(int x)
{
    double ret = 0;
    for(int i = 0; i < n; ++i) if(x & (1 << i)) ret += p[i];
    return 1 - ret;
}
int main()
{
    scanf("%d%d", &n, &k); all = 1 << n; int m = 0;
    for(int i = 0; i < n; ++i)
    {
        scanf("%lf", &p[i]);
        if(fabs(p[i]) > eps) ++m;
    }
    k = min(k, m);
    dp[0] = 1;
    for(int i = 0; i < all; ++i)
    {
        double sum = getsum(i);
        for(int j = 0; j < n; ++j) if(!(i & (1 << j)))
            dp[i | (1 << j)] += dp[i] * p[j] / sum;
    }
    for(int i = 0; i < all; ++i) if(__builtin_popcount(i) == k)
        for(int j = 0; j < n; ++j) if(i & (1 << j)) ans[j] += dp[i];
    for(int i = 0; i < n; ++i) printf("%.7f ", ans[i]);
    return 0;
}
时间: 2024-08-03 10:14:27

698C的相关文章

【codeforces 698C】LRU

题目链接: http://codeforces.com/problemset/problem/698/C 题目大意: n个物品,k个格子,第i个物品每次被选取的概率为$p_{i}$,如果格子里没有该物品就把它丢进去,如果没有,再看格子是否被装满,如果被装满,就把最早选取的替换成该物品,求$10^{100}$次后格子里含有每个物品的概率. 答案精度要求小于$10^{-6}$. 题解: 就不能自己玩一次试试吗= = 因为选取的次数太多了,所以可以看做一定会选到能选取的物品.(有一些为0的当然选不到了

东北育才10天大总结

老师们 Scanf的嗓门照例是最大的.恩. “我是山里的孩子……小的时候背书,整个山头都听得见……” 有一个哈师大附中的竞赛教练很……怎么说呢?接地气好了. Scanf说东北人很耿直,似乎确实是这样的.衡水的教练早就被遣返了…… “他啊,监考去了!” 虽然他不在,但还是不还手机.让衡水的人天天在电脑上颓废…… Scanf不在,你看我们就很老实.他到处“乱”玩,甚至跑到了国境线边,连火车票都忘了买,坐高铁去,乘绿皮火车回,路过长白山就去玩了一趟,结果暴风雪逼得他去吃“暴辣”的烤鱿鱼. “我看<三八