hdu 4336 Card Collector 容斥原理

读完题目就知道要使用容斥原理做!

下面用的是二进制实现的容斥原理,详见:http://www.cnblogs.com/xin-hua/p/3213050.html

代码如下:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
#define MAX 50000
using namespace std;
double an[22];
double solve(int n)
{
    int i,j;
    double ans=0.0;
    for(i=1;i<(1<<n);i++){
        int num=0;
        double sum=0.0;
        for(j=0;j<n;j++){
            if(i&(1<<j)){
                num++;
                sum+=an[j];
            }
        }
        if(num&1) ans+=1.0/sum;
        else ans-=1.0/sum;
    }
    return ans;
}
int main(){
    int n,i;
    while(cin>>n){
        for(i=0;i<n;i++)
            cin>>an[i];
        printf("%lf\n",solve(n));
    }
    return 0;
}
View Code

 

 

 

posted @ 2013-08-01 16:12  _随心所欲_  阅读(232)  评论(0编辑  收藏  举报