• codeforces 464D


    你在玩一个游戏,游戏中有k种装备,每件装备都有一个等级,初始时你拥有每种1级装备各一件
    你打算刷n只怪,每刷一只怪之后系统就会随机爆出一件装备
    随机方式是先等概率随机装备的种类,设你当前拥有的这种装备的等级为t,则系统会在1~t+1之间等概率随机装备的等级
    由于某些原因,你决定只在爆出的装备高于当前装备的等级时换上新装备并卖掉旧装备,否则直接卖掉爆出的装备,卖掉等级为t的装备可以得到t个金币
    求你刷n只怪后得到的金币数的期望
    n<=10^5,k<=100

    题解:

    与毛球那个题一样用到每个武器相互独立,互不影响

    只要求出每个武器的金币期望,答案就是 它再乘k

    我们定义f[i][j]为还剩下i个怪兽没打,当前武器星级为j时的金币期望(这又是一个逆序定义)

    f[i][j]=           (k-1)/k*f[i-1][j] +       1/k * (          j/(j+1)*(f[i-1][j]+(j+1)/2)     +             1/(j+1)*(f[i-1][j+1]+j)    )

                      选了其他武器        选了这个武器   再杀一个怪兽爆 j星 以内的武器      再杀一个怪兽爆了j+1星的武器

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<cmath>
     5 #define mem(a,b) memset(a,b,sizeof(a))
     6 #define dd double
     7 using namespace std;
     8 
     9 int n,k;
    10 dd f[2][1001];
    11 int nn;
    12 
    13 int main(){
    14     scanf("%d%d",&n,&k);
    15     nn=600;
    16     int now=0;
    17     dd q1,q2,q3;
    18     for(int i=1;i<=n;++i)
    19     {
    20         now^=1;
    21         for(int j=1;j<=nn;++j)
    22         {
    23             q1=(k-1.0)/k*f[now^1][j];
    24             q2=1.0/k*j/(j+1.0)*(f[now^1][j]+(j+1.0)/2);
    25             q3=1.0/k*1/(j+1.0)*(f[now^1][j+1]+j);
    26           f[now][j]=q1+q2+q3;
    27         }
    28     }
    29     printf("%.10lf",f[now][1]*(dd)k);
    30     //while(1);
    31     return 0;
    32 }
    code
  • 相关阅读:
    hdu 5392 Infoplane in Tina Town(数学)
    hdu 5391 Zball in Tina Town(打表找规律)
    poj 2251 Dungeon Master(bfs)
    hdu 5313 Bipartite Graph(dfs染色 或者 并查集)
    [转]notifyDataSetChanged() 动态更新ListView
    Android之Intent
    LinearLayout 和 RelativeLayout
    poj 2955 Brackets(区间dp)
    poj 1651 Multiplication Puzzle(区间dp)
    poj 3186 Treats for the Cows(区间dp)
  • 原文地址:https://www.cnblogs.com/A-LEAF/p/7241057.html
Copyright © 2020-2023  润新知