【codeforces 768D】Jon and Orbs

【题目链接】:http://codeforces.com/contest/768/problem/D

【题意】

你有一个水晶;
它每天都会产生一个球??(球有k种)
然后每种球产生的可能性是相同的->1/k
然后给你q个询问;
每个询问pi;
问你最少需要多少天;
每种球至少有一个的概率大于等于pi/2000;
这里pi<=1000

【题解】

动态规划;
考虑按天划分状态;
设f[i][j]表示第i天一共有j种球的概率;
则第i天考虑两种情况
1.拿到了一个新的球,从原来的j-1种球变成了j种球->概率是(k-j+1)/k
2.拿到了原先就有的球,原来的j种球,球类总数不变,天数增加了1->概率是j/k
则有动态转移方程
f[i][j] = f[i-1][j-1]*(k-j+1)/k+f[i-1][j]*j/k;
直到f[i][k]>1/2就好了;
因为pi最大为1000,而分母为2000;
数组第一维开多大??
1000*10
为什么??

是因为循环次数吧.
或者你再开大一点也没关系:->中间break掉就好
只要不超时就好;
可以预处理出1..1000的答案;
扫一遍就可以了

【Number Of WA

1

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define ps push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)

typedef pair<int, int> pii;
typedef pair<LL, LL> pll;

const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 1e3+100;

int k, q,ans[N];
double f[N * 10][N];

int main()
{
    //freopen("F:\\rush.txt", "r", stdin);
    rei(k), rei(q);
    f[0][0] = 1;
    rep1(i, 1, 10000)
    {
        rep1(j, 1, k)
            f[i][j] = f[i - 1][j - 1] * ((k - j + 1)*1.0 / (1.0*k)) + f[i - 1][j] * (j*1.0 / (1.0*k));
        if (f[i][k] > 0.5) break;
    }
    int now = 1;
    rep1(i, 1, 1000)
    {
        while (f[now][k] * 2000 < i)
            now++;
        ans[i] = now;
    }
    while (q--)
    {
        int x;
        rei(x);
        cout << ans[x] << endl;
    }
    //printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}
posted @ 2017-10-04 18:44  AWCXV  阅读(101)  评论(0编辑  收藏  举报