ZOJ1363 Chocolate
Chocolate
Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge
In 2100, ACM chocolate will be one of the favorite foods in the world.
"Green, orange, brown, red��", colorful sugar-coated shell maybe is the most attractive feature of ACM chocolate. How many colors have you ever seen? Nowadays, it's said that the ACM chooses from a palette of twenty-four colors to paint their delicious candy bits.
One day, Sandy played a game on a big package of ACM chocolates which contains five colors (green, orange, brown, red and yellow). Each time he took one chocolate from the package and placed it on the table. If there were two chocolates of the same color on the table, he ate both of them. He found a quite interesting thing that in most of the time there were always 2 or 3 chocolates on the table.
Now, here comes the problem, if there are C colors of ACM chocolates in the package (colors are distributed evenly), after N chocolates are taken from the package, what's the probability that there is exactly M chocolates on the table? Would you please write a program to figure it out?
Input
The input file for this problem contains several test cases, one per line.
For each case, there are three non-negative integers: C (C <= 100), N and M (N, M <= 1000000).
The input is terminated by a line containing a single zero.
Output
The output should be one real number per line, shows the probability for each case, round to three decimal places.
Sample Input
5 100 2
0
Sample Output
0.625
2100年,ACM牌巧克力将风靡全球。
题意
“绿的,橘红的,棕色的,红的…”,彩色的糖衣可能是ACM巧克力最吸引人的地方。你一共见过多少种颜色?现在,据说ACM公司从一个24种颜色的调色板中选择颜色来装饰他们的美味巧克力。
有一天,Sandy用一大包有五种颜色的巧克力玩了一个游戏。每次他从包里拿出一粒巧克力并把它放在桌上。如果有桌上有两粒相同颜色的巧克力,他就把他们吃掉。他惊奇的发现大多数时候桌上都有2到3粒巧克力。
如果ACM巧克力有C(1≤C≤100)种颜色,在拿出了N(1≤N≤1000000)粒巧克力之后在桌上恰有M(1≤M≤1000000)粒的概率是多少?
分析
如果N不是那么大的话,我们是很容易用动态规划来解决此题,状态转移方程就是
Pi+1,k=Pi,k-1*(C-k-1)/C+Pi,k+1*(k+1)/C
其中Pi,k表示拿出了i粒巧克力后桌上剩余M粒的概率(当然还要考虑一些边界情况)。但是现在N可以达到1000000,如果直接动态规划肯定是要超时的。
这个题的标准算法是使用生成函数。也就是说把“桌上有m块巧克力”转化成“有m种巧克力取了奇数块,其余的都取偶数块的取法”。所以就可以列出生成函数是,所以总的取法数就是xn的系数乘以n!和C(c,m),而概率就是总的取法数除以cn,然后通过进一步的代数分析来化简解决。这种方法当然是很优秀的,复杂度是O(c2)。但是由于这道题的精度要求很低,迭代的方法也是可以达到目的的,而且复杂度也接近O(c2)。
这道题里不会出现极大或极小的概率,一般来说这种情况下的收敛是比较快的。我们可以不断的计算P的值,当它的变化不足以影响结果时就停止计算。当然这道题里的收敛是分奇偶的(显然桌上剩余的巧克力数和拿出的巧克力数是同奇偶的),所以不能比较Pi和Pi-1,而要比较Pi和Pi-2,只要看到Pi和Pi-2差距小于一个定值(比如1e-5),而且i和N同奇偶,就可以停止动态规划,因为此时继续规划下去所产生的不同已经不可能影响到要输出的结果。经过实验发现,最大的数据也只在几百次迭代中就稳定了,这样就将效率大大提高,满足了题目的要求。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=;
double f[N][N];int n,m,c;
int main(){
while(~scanf("%d",&c)&&c){
scanf("%d%d",&n,&m);
if(!n&&!m){puts("1.000");continue;}
if(m>n||m>c||(n+m)&){puts("0.000");continue;}
if(n>) n=+(n&);
memset(f,,sizeof f);f[][]=;
for(int i=;i<=n;i++){
for(int j=;j<=min(i,c);j++){
if(i+j&){
f[i][j]=;continue;
}
if(j>) f[i][j]+=f[i-][j-]*(-(double)(j-)/(double)c);
if(j<i) f[i][j]+=f[i-][j+]*(double)(j+)/(double)c;
}
}
printf("%.3lf\n",f[n][m]);
}
return ;
}
ZOJ1363 Chocolate的更多相关文章
- ZOJ1363 Chocolate 【生成函数】 【泰勒展开】
题目大意: 有c种不同的巧克力,每种无限个,意味着取出每种的几率每次为1/c.现在你需要取n次.然后将统计每种取出来的巧克力的数量.若为偶数则舍去,否则留下一个.问最后留下m个的概率是多少. 题目分析 ...
- Big Chocolate
Big Chocolate 题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19127 Big Chocolat ...
- Dividing a Chocolate(zoj 2705)
Dividing a Chocolate zoj 2705 递推,找规律的题目: 具体思路见:http://blog.csdn.net/u010770930/article/details/97693 ...
- hdu----(4301)Divide Chocolate(状态打表)
多校综合排名前25名的学校请发送邮件到HDUACM@QQ.COM,告知转账信息(支付宝或者卡号) Divide Chocolate Time Limit: 2000/1000 MS (Java/Oth ...
- Codeforces Round #340 (Div. 2) B. Chocolate 水题
B. Chocolate 题目连接: http://www.codeforces.com/contest/617/problem/D Descriptionww.co Bob loves everyt ...
- Codeforces Round #310 (Div. 1) C. Case of Chocolate set
C. Case of Chocolate Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/555/ ...
- codeforces 678C C. Joty and Chocolate(水题)
题目链接: C. Joty and Chocolate time limit per test 1 second memory limit per test 256 megabytes input s ...
- CodeForces 689C Mike and Chocolate Thieves (二分+数论)
Mike and Chocolate Thieves 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/G Description ...
- Educational Codeforces Round 1 E. Chocolate Bar 记忆化搜索
E. Chocolate Bar Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/598/prob ...
随机推荐
- keep-alive pipeline区别
在http1.1中,引入了一种新的特性,即pipeline.那么什么是pipeline呢?pipeline其实就是流水线作业,它可以看作为keepalive的一种升华,因为pipeline也是基于长连 ...
- 【WP8】自定义控件
1.测量和安排布局:MeasureOverride, ArrangeOverride //测量(传入控件的可用大小) protected override Size MeasureOverride(S ...
- mybatis-generator 的坑我都走了一遍
一.简介 mybatis-geneator是一款mybatis自动代码生成工具,可以通过配置,快速生成mapper和xml文件. 二.配置方法 在项目的pom文件中添加插件配置 <plugin& ...
- 源码分析二(ArrayList与LinkedList的区别)
一:首先看一下ArrayList类的结构体系: public class ArrayList<E> extends AbstractList<E> implements Lis ...
- 几个实用的sublime text 2的快捷键
Sublime text快捷键 Sublime text 2是一款轻量.简洁.高效.跨平台的编辑器,他适合编写javascript,html,css,php,paython等等, 作为程序员,编码效率 ...
- MTK 预置apk
一.如何将带源码的APK预置进系统? 1) 在 packages/apps 下面以需要预置的 APK的 名字创建一个新文件夹,以预置一个名为Test的APK 为例 2) 将 Test ...
- iOS中js与objective-c的交互(转)
因为在iOS中没有WebKit.Framework这个库的,所以也就没有 windowScriptObject对象方法了.要是有这个的方法的话 就方便多了,(ps:MacOS中有貌似) 现在我们利用其 ...
- AndroidManifest详解
一,重要性AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目 ...
- webstorm批量查找,批量替换快捷键
ctrl+shift+f:批量查找,我的webstorm11不能用ctrl+shift+f进行批量查找了,不知道什么原因,自己又胡乱实验了一下, 发现ctrl+shift+g+f可以批量查找 ctrl ...
- 2018.8.23几日重新编译OSG+OE+Qt遇到的问题
Qt安装多个版本的时候,注意屏蔽掉不使用的Qt,例如OE中的CMakeLists.txt中的# FIND_PACKAGE(Qt4) 使用以前编译好的libcurl.dll现在出现"无法定位序 ...