首页 > 其他 > 详细

min-max容斥(学习笔记)

时间:2019-02-03 21:52:10      阅读:233      评论:0      收藏:0      [点我收藏+]

min-max容斥:

给定集合S,设max{S}S中的最大值,min{S}为集合S中的最小值。
那么我们可以得到:
max{S}=T?S(?1)|T|+1min{T}

证明: 咕咕咕

 

对于期望来说,min-max容斥同样适用

E(max{x1,x2...xn})=S(?1)|S|+1E(min iS{xi})

 

例题:hdu 4336

这道题可以用状压dp来做

但是min-max有更优秀的空间复杂度O(n)

dfs枚举子集来计算   E(min{T})=1iTpi

// min-max 容斥 
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;

const int maxn = 25;
const double eps = 1e-7;

int n;
double ans,p[maxn];

void dfs(int d,double tot,double opt){
    if(d==n){
        if(tot>eps)    // 很关键!! 
            ans+=opt/tot;
        return;
    }
    dfs(d+1,tot+p[d],-opt);
    dfs(d+1,tot,opt);
}

ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<0 || ch>9){ if(ch==-) f=-1; ch=getchar(); } while(ch>=0 && ch<=9){ s=s*10+ch-0; ch=getchar(); } return s*f; }

int main(){
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++) scanf("%lf",&p[i]);
        ans=0;
        dfs(0,0,-1); // 枚举子集 
        printf("%.4lf\n",ans);
    }
    return 0;
}

 

min-max容斥(学习笔记)

原文:https://www.cnblogs.com/tuchen/p/10351047.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!