Deceptive Dice (規律)

Deceptive Dice 計蒜客 - 43468

Recently your town has been infested by swindlers who convince unknowing tourists to play a simple dice game with them for money. The game works as follows: given is an n-sided die,whose sides have 1, 2, . . . , n pips, and a positive integer k. You then roll the die, and then have to make a choice. Option 1 is to stop rolling. Option 2 is to reroll the die, with the limitation that the die can only be rolled k times in total. Your score is the number of pips showing on your final roll.

Obviously the swindlers are better at this game than the tourists are. You, proud supporter of the Battle Against ProbabilisticCatastrophes, decide to fight this problem not by banning the swindlers but by arming the tourists with information.

You create pamphlets on which tourists can find the maximum expected score for many values of n and k. You are sure that the swindlers will soon stop their swindling if the tourists are better prepared than they are!

The layout of the flyers is done, and you have distribution channels set up. All that is left to do is to calculate the numbers to put on the pamphlet.

Given the number of sides of the die and the number of times you are allowed to roll, calculate the expected (that is, average) score when the game is played optimally.

image.jpg

INPUT:

• A single line with two integers 1 ≤ n ≤ 100, the number of sides of the die, and 1 ≤ k ≤ 100, the number of times the die may be rolled.

OUTPUT:

Output the expected score when playing optimally. Your answer should have an absolute or relative error of at most 10^-7.

Sample Input 4:

8 9

Sample Output 4:

7.268955230712891

樣例輸入
1 1
樣例輸出
1

題意:一個n面的篩子,至多可以投擲k次,最後一次投擲的結果就是最終結果,儘量最大,每一次投擲後,結果出來,你可以選擇取消這次投擲(投擲次數要減一),在最好的策略下,結果最大值是多少

  • 例如n = 20,k = 3;
  • 第一次投擲期望值爲10.5
  • 第二次投擲,因爲結果要比前一次大才會取,否則取前一次的數,所以要取11-20範圍內的數,結果爲13
  • 第三次同理,投擲到了14-20範圍的數,就取,否則取13,結果爲14.4
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+9;
int main()
{
    long long n,k;
    double ans = 0;
    cin>>n>>k;
    for(int i = 1;i<=k;i++)
    {
        long long num = floor(ans+1);
        ans = ans*(num-1.0)/n +(n+num)*(n-num+1)*1.0/n/2;
    }
    printf("%.9lf\n",ans);

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章