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

 

 

 

你可能感兴趣的:(Collector)