POJ1322----Chocolate
3375 단어 dp
Time Limit: 2000MS
Memory Limit: 65536K
Total Submissions: 8743
Accepted: 2291
Special Judge
Description
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
Source
Beijing 2002
확률 dp, 방정식이 잘 떠오르는 dp[i][j]는 i회, 테이블 위에 j개의 초콜릿이 있는 확률 dp[i][j]=(1-(j-1)/c)*dp[i-1][j-1]+(j+1)/c*dp[i-1][j+1];데이터 범위가 너무 넓기 때문에 스크롤 그룹을 사용한 다음에 순환 순서에 주의해야 한다. 그래서 먼저 순환 i를 이렇게 쓰면 TLE가 필요하다. 이 문제는 정말 나로 하여금 진심으로 탄복하게 한다. 그리고 출력 3자리 소수의 근사해에 따라 n을 압축하고 자세를 높일 수 있다.
/*************************************************************************
> File Name: POJ1322.cpp
> Author: ALex
> Mail: [email protected]
> Created Time: 2014 12 30 20 23 07
************************************************************************/
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
double dp[2][105];
int main()
{
int c, n, m;
while (~scanf("%d", &c))
{
if (c == 0)
{
break;
}
scanf("%d%d", &n, &m);
if (m > c || m > n)
{
printf("0.000
");
continue;
}
if (n > 1001)
{
n = (n % 2) ? 1001 : 1000;
}
memset (dp, 0, sizeof(dp));
dp[0][0] = 1;
for (int i = 1; i <= n; ++i)
{
for (int j = 0; j <= min(c, i); ++j)
{
dp[i % 2][j] = 0;
if (j > 0)
{
dp[i % 2][j] = ((c - j + 1) * 1.0 / c) * dp[1 - i % 2][j - 1];
}
if (j + 1 > i - 1)
{
continue;
}
dp[i % 2][j] += ((j + 1) * 1.0 / c) * dp[1 - i % 2][j + 1];
}
}
printf("%.3f
", dp[n % 2][m]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.