UVA 10375 Choose and divide

来源:互联网 发布:什么软件改变图片大小 编辑:程序博客网 时间:2024/05/17 18:18
#include <map>#include <set>#include <list>#include <cmath>#include <ctime>#include <deque>#include <stack>#include <queue>#include <cctype>#include <cstdio>#include <string>#include <vector>#include <climits>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define PI 3.1415926535897932626using namespace std;int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}#define MAXN 10005int cnta[MAXN],cntb[MAXN];int veca[MAXN],vecb[MAXN];int casa,casb;int P,Q,R,S;int main(){    //freopen("sample.txt","r",stdin);    while (scanf("%d%d%d%d",&P,&Q,&R,&S)!=EOF)    {        double ans=1;        casa=0;casb=0;        memset(cnta,0,sizeof(cnta));        memset(cntb,0,sizeof(cntb));        for (int i=Q+1;i<=P;i++)            cnta[i]++;        for (int i=S+1;i<=R;i++)            cntb[i]++;        if (R-S>=P-Q)          for (int i=P-Q+1;i<=R-S;i++)            cnta[i]++;        else          for (int i=R-S+1;i<=P-Q;i++)            cntb[i]++;        for (int i=0;i<MAXN;i++)        {            int tmp=min(cnta[i],cntb[i]);            cnta[i]-=tmp;            cntb[i]-=tmp;        }        for (int i=0;i<MAXN;i++)        {            if (cnta[i])            {                for (int j=0;j<cnta[i];j++)                    veca[casa++]=i;            }            if (cntb[i])            {                for (int j=0;j<cntb[i];j++)                    vecb[casb++]=i;            }        }        int limit=min(casa,casb),r=max(casa,casb);        for (int i=0;i<limit;i++)            ans*=(double)veca[i]/vecb[i];        if (r==casa)            for (int i=limit;i<casa;i++)            ans*=veca[i];        else            for (int i=limit;i<casb;i++)            ans/=(double)vecb[i];        printf("%.5f\n",ans);    }    return  0;}

0 0
原创粉丝点击