zoukankan      html  css  js  c++  java
  • tyvj1519博彩游戏

    博彩游戏
    From admin
    背景 Background
    Bob最近迷上了一个博彩游戏……
    描述 Description
    这个游戏的规则是这样的:
    每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列;
    有M个序列,如果某个序列是产生的随机序列的子串,那么就中奖了,否则不中。
    Bob会告诉你这M个序列,和身上有的钱的总数N,当然还有R的范围。
    请你告诉Bob中奖的概率有多少?
    输入格式 InputFormat
    第一行三个用空格隔开的数N、M和R的范围R。
    其中1<=R<=9,0<N<=60,0<M<=20000。
    下面M行每行一个字符串(长度小于等于20),字符串的每一位范围在1-r之间
    保证必要运算都在64位整型范围内。
    输出格式 OutputFormat
    一行一个实数,表示中奖的概率(保留小数点后5位小数)。
    样例输入 SampleInput [复制数据]
    5 1 3
     
     
     
    样例输出 SampleOutput [复制数据]
    0.86831
     
     
     
    数据范围和注释 Hint
    数据分布:
    第1个点~第10个点,每个点5分;
    第11个点~第15个点,每个点10分。

    对于样例的解释:
    随机序列一共有3^5=243个,其中包含"1"的个数为211个,则概率为211/243=0.86831
     
     
     
     
    来源 Source
    Bob HAN
    题解:
    这题和上一题差不多
    代码 :
     1 var n,m,r,i,j,tot:longint;
     2     ans1,ans2:int64;
     3     a:array[0..400000,0..20] of longint;
     4     f:array[0..60,0..400000] of int64;
     5     fail,q:array[0..400000] of longint;
     6     flag:array[0..400000] of boolean;
     7     s:string;
     8 procedure insert;
     9  var i,now:longint;
    10  begin
    11  readln(s);now:=1;
    12  for i:=1 to length(s) do
    13   begin
    14   j:=ord(s[i])-ord('0');
    15   if a[now,j]=0 then begin inc(tot);a[now,j]:=tot;end;
    16   now:=a[now,j];
    17   end;
    18  flag[now]:=true;
    19  end;
    20 procedure acmatch;
    21  var h,t,i,now,k:longint;
    22  begin
    23  h:=0;t:=1;q[1]:=1;fail[1]:=0;
    24  while h<t do
    25   begin
    26   inc(h);now:=q[h];
    27   for i:=1 to r do
    28    begin
    29    if a[now,i]=0 then continue;
    30    k:=fail[now];
    31    while a[k,i]=0 do k:=fail[k];
    32    fail[a[now,i]]:=a[k,i];
    33    if flag[a[k,i]] then flag[a[now,i]]:=true;
    34    inc(t);q[t]:=a[now,i];
    35    end;
    36   end;
    37  end;
    38 procedure init;
    39  begin
    40  tot:=1;
    41  readln(n,m,r);
    42  for i:=1 to r do a[0,i]:=1;
    43  for i:=1 to m do insert;
    44  acmatch;
    45  end;
    46 procedure dp(x:longint);
    47  var i,j,k:longint;
    48  begin
    49  for i:=1 to tot do
    50   begin
    51   if (flag[i]) or (f[x-1,i]=0) then continue;
    52   for j:=1 to r do
    53    begin
    54    k:=i;
    55    while a[k,j]=0 do k:=fail[k];
    56    inc(f[x,a[k,j]],f[x-1,i]);
    57    end;
    58   end;
    59  end;
    60 procedure main;
    61  begin
    62  ans2:=1;
    63  f[0,1]:=1;
    64  for i:=1 to n do ans2:=ans2*r;
    65  for i:=1 to n do dp(i);
    66  for i:=1 to tot do
    67   if not(flag[i]) then inc(ans1,f[n,i]);
    68  writeln((ans2-ans1)/ans2:0:5);
    69  end;
    70 begin
    71  assign(input,'input.txt');assign(output,'output.txt');
    72  reset(input);rewrite(output);
    73  init;
    74  main;
    75  close(input);close(output);
    76 end.                               
    View Code
  • 相关阅读:
    红黑树
    二叉搜索树
    散列表
    基本数据结构
    顺序统计量
    RabbitMQ一些实用方法
    (转)elasticsearch连接不到head插件解决方案
    (转)如何优雅的使用rabbit mq
    (转)elasticsearch6.0版本安装head插件
    Rabbit MQ一些参数解释
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3840603.html
Copyright © 2011-2022 走看看