zoukankan      html  css  js  c++  java
  • 取书问题

    【题目描述】

    有n个同学坐成一列,按从前往后的顺序传n本课本,其中第i个同学会从n-i+1本课本中选一本并把剩下的课本传给后面的一位同学。已知每本课本都有独一无二的新旧程度,第i(i<n)个同学在挑选课本的时候满足如下过程:

    1.如果只剩下一本书,则一定拿走,否则转步骤2

    2.从剩下的书中抽出最新的一本

    3.以ai的概率选择这本书并结束选择,1-ai的概率将这本书传给后面的同学并回到过程1

    现在最后一位同学想知道传到他手上的书的新旧程度在所有n本书中排名的期望是多少。注意:本题的所有分数均在mod 1e9+7意义下,即如果一个分数可以表示成x/y的形式,则在本题中以x*(y^(1e9+5)) (mod 1e9+7)的形式给出,同时如果你要输出一个分数x/y,你也应输出x*(y^(1e9+5)) (mod 1e9+7)。

    【输入格式】

    第一行一个正整数n

    接下来n-1个整数ai表示概率

    【输出格式】

    一个整数表示最后一位同学拿到的书的新旧程度在所有n本书中排名的期望。

    【样例】

    book1.in

    book1.out

    3

    666666672 500000004

    277777782

    大样例见下发文件book2.in/out,book3.in/out

    【样例解释】

    sample1:

        666666672=2/3(mod1e9+7),500000004=1/2(mod1e9+7)表示第一个同学有2/3的概率拿最新的书,否则将会有(1-2/3)*2/3 = 2/9的概率拿第二新的书,否则有1/9的概率拿第三新的书。当第一位同学拿完书时,第二位同学等概率取剩下两本。故最后一位同学拿到的书新旧程度的期望为1/3*2+1/3*3+1/9*1

    +1/9*3+1/18*1+1/18*2=41/18=277777782(mod 1e9+7)

    【数据范围及约定】

    对于100%的数据 n≤300,0≤ai<1000000007

    性质1:ai=0或1           性质2:ai=500000004

    编号

    n

    其它

    编号

    n

    其它

    1

    2

    11

    20

    2

    7

    12

    300

    性质1

    3

    8

    13

    250

    性质2

    4

    9

    14

    300

    5

    10

    15

    40

    6

    16

    16

    50

    7

    17

    17

    100

    8

    18

    18

    150

    9

    19

    19

    250

    10

    20

    20

    300

    考虑枚举最后剩那本书,然后我们就只需要考虑其他书对于这本书的相对位置。

    也就是说,只要记录有几本书比枚举的新。预处理之后概率dp即可。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define MOD 1000000007
     4 int f[310][310], g[310][310], t[310][310];
     5 int n, a[310];
     6 inline void Add(int &x, int y) {
     7     x += y;
     8     if(x >= MOD) x -= MOD;
     9 }
    10 inline void init() {
    11     for(int i = 1; i < n; ++ i) {
    12         for(int j = 0; j <= n - i; ++ j) {
    13             int now = 1;
    14             for(int k = 1; k <= j; ++ k) {
    15                 Add(g[i][j], 1ll * now * a[i] % MOD);   
    16                 now = 1ll * now * (MOD + 1 - a[i]) % MOD;
    17             }
    18             t[i][j] = 1ll * now * a[i] % MOD;
    19         }
    20     }
    21 }
    22 int main() {
    23     scanf("%d", &n);
    24     for(int i = 1; i < n; ++ i) {
    25         scanf("%d", &a[i]);
    26     }
    27     init();
    28     int Ans = 0;
    29     for(int k = 1; k <= n; ++ k) {
    30         memset(f, 0, sizeof(f));
    31         f[1][n - k] = 1;
    32         for(int i = 1; i < n; ++ i) {
    33             for(int j = 0; j <= n - i; ++ j) if(f[i][j]) {
    34                 if(j) Add(f[i + 1][j - 1], 1ll * f[i][j] * g[i][j] % MOD);
    35                 Add(f[i + 1][j], 1ll * f[i][j] * (2 * MOD + 1 - g[i][j] - t[i][j]) % MOD);
    36             }
    37         }
    38         Add(Ans, 1ll * f[n][0] * (n - k + 1) % MOD);
    39     }
    40     printf("%d
    ", Ans);
    41 }
     
  • 相关阅读:
    HDU 3081 Marriage Match II
    HDU 4292 Food
    HDU 4322 Candy
    HDU 4183 Pahom on Water
    POJ 1966 Cable TV Network
    HDU 3605 Escape
    HDU 3338 Kakuro Extension
    HDU 3572 Task Schedule
    HDU 3998 Sequence
    Burning Midnight Oil
  • 原文地址:https://www.cnblogs.com/iamqzh233/p/9588153.html
Copyright © 2011-2022 走看看