巧克力(zoj 1363)

2100年,ACM牌巧克力将风靡全球。

“绿的,橘红的,棕色的,红的…”,彩色的糖衣可能是ACM巧克力最吸引人的地方。你一共见过多少种颜色?现在,据说ACM公司从一个24种颜色的调色板中选择颜色来装饰他们的美味巧克力。

有一天,Sandy用一大包有五种颜色的巧克力玩了一个游戏。每次他从包里拿出一粒巧克力并把它放在桌上。如果有桌上有两粒相同颜色的巧克力,他就把他们吃掉。他惊奇的发现大多数时候桌上都有2到3粒巧克力。

如果ACM巧克力有C(1≤C≤100)种颜色,在拿出了N(1≤N≤1000000)粒巧克力之后在桌上恰有M(1≤M≤1000000)粒的概率是多少?

/*
  转移方程很好想,f[i][j]表示取了i个恰好有j个在桌子上的概率
  f[i][j]=f[i-1][j+1]*(j+1)/c+f[i-1][j-1]*(j+1)/c
  但是这道题的n特别大,所以考虑一种神奇的方法。
  由于本题对精度的要求不高,而且越到后面,它与前面的相差并不大,所以我们可以只求一部分。
  需要注意的是,当n+m是奇数时,概率一定是0,所以要奇偶划分。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 1010
using namespace std;
double dp[N][N];int c,n,m;
int main(){
    freopen("jh.in","r",stdin);
    while(scanf("%d",&c)&&c){
        memset(dp,0,sizeof(dp));
        scanf("%d%d",&n,&m);
        if(!n&&!m){
            printf("1.000\n");
            continue;
        }
        if(m>c||m>n||(m+n&1)){
            printf("0.000\n");
            continue;
        }
        if(n>1000){
            if(n&1) n=1001;
            else n=1000;
        }
        dp[1][1]=1;
        for(int i=2;i<=n;i++)
            for(int j=0;j<=min(i,c);j++){
                if(i+j&1) {dp[i][j]=0;continue;}
                if(j>0) dp[i][j]+=dp[i-1][j-1]*double(c-j+1)/double(c);
                if(j+1<i) dp[i][j]+=dp[i-1][j+1]*double(j+1)/double(c);
            }
        printf("%.3lf\n",dp[n][m]);
    }
    return 0;
}
时间: 2024-10-28 08:36:38

巧克力(zoj 1363)的相关文章

zoj题目分类

饮水思源---zoj 转载自:http://bbs.sjtu.edu.cn/bbscon,board,ACMICPC,file,M.1084159773.A.html 注:所有不是太难的题都被归成了“简单题”,等到发现的时候已经太晚了,我太死脑筋 了……:( 有些题的程序我找不到了,555……:( SRbGa的题虽然都很经典……但是由于其中的大部分都是我看了oibh上的解题报告后做 的,所以就不写了…… 题目排列顺序没有规律……:( 按照个人感觉,最短路有的算做了DP,有的算做了图论. 有些比较

zoj 3866

G - Cylinder Candy Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3866 Description Edward the confectioner is making a new batch of chocolate covered candy. Each candy center is shaped as a cylin

zoj 1520 - Duty Free Shop

题目:Pedro买了两块不同牌子的巧克力,他找到了一些小盒子,他准备把巧克力分开,放在小盒子里送给朋友: 为了不被朋友发现自己是为了省钱,每个小盒子中只能放相同牌子的巧克力,求分法. 分析:dp,01背包. 这里每个小盒子作为物品,其中第一块巧克力作为箱子,记录每个箱子的前驱(路径): 然后,枚举所有的第一块巧克力的可分状态,判断第二块巧克力是否可以装下剩下的小盒子: 找到合法的情况,逆序输出路径即可. 说明:当时zoj的第50道 dp O(∩_∩)O~ #include <stdio.h>

ZOJ 3866 Cylinder Candy (浙大校赛+积分应用)

题目链接:ZOJ 3866 Cylinder Candy 题意:抽象出来就是求一个圆柱体外面加一层厚度为d的巧克力,求包装完这个立体图形的体积和表面积. 剖析: 以下是包装后的三视图: 图3 接下里就是积分了 2*V1是图3绕y轴的体积 V2是中间的半径为(r+d)的圆柱体积 S1是中间的半径为(r+d)的圆柱的表面积 S2是上下两个半径为r的圆的面积 S3是图3绕y轴的侧面积 附上旋转体的侧面积和体积求法: AC代码: #include <stdio.h> #include <math

概率dp ZOJ 3640

Help Me Escape Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3640 Appoint description:  System Crawler  (2014-10-22) Description Background     If thou doest well, shalt thou not be accepted? an

zoj 2156 - Charlie&#39;s Change

题目:钱数拼凑,面值为1,5,10,25,求组成n面值的最大钱币数. 分析:dp,01背包.需要进行二进制拆分,否则TLE,利用数组记录每种硬币的个数,方便更新. 写了一个 多重背包的 O(NV)反而没有拆分快.囧,最后利用了状态压缩优化 90ms: 把 1 cents 的最后处理,其他都除以5,状态就少了5倍了. 说明:貌似我的比大黄的快.(2011-09-26 12:49). #include <stdio.h> #include <stdlib.h> #include <

ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 最小生成树 Kruskal算法

题目链接:ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 Building a Space Station Time Limit: 2 Seconds      Memory Limit: 65536 KB You are a member of the space station engineering team, and are assigned a task in the construction process of the statio

ZOJ 3607 Lazier Salesgirl (贪心)

Lazier Salesgirl Time Limit: 2 Seconds      Memory Limit: 65536 KB Kochiya Sanae is a lazy girl who makes and sells bread. She is an expert at bread making and selling. She can sell the i-th customer a piece of bread for price pi. But she is so lazy

ZOJ - 2243 - Binary Search Heap Construction

先上题目: Binary Search Heap Construction Time Limit: 5 Seconds      Memory Limit: 32768 KB Read the statement of problem G for the definitions concerning trees. In the following we define the basic terminology of heaps. A heap is a tree whose internal n