Advertisement
Guest User

Untitled

a guest
Apr 14th, 2020
379
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. /*
  2. * Author : Chillax
  3. * 禁止任何形式商用
  4. * 首发TapTap论坛,转载请注明出处: https://www.taptap.com/topic/11555825
  5. */
  6.  
  7. #include <iostream>
  8. #include <string.h>
  9. #include <iomanip>
  10. using namespace std;
  11.  
  12. #define N_MAX 2048
  13. int maxN = 0; //总数
  14. #define M_MAX 64
  15. int maxM = 0; //成功数
  16. #define K_MAX 99
  17. int startK = 0; //初始k值
  18. #define P_WIN 0.014
  19.  
  20. // P[n][m][k]表示抽取n次,抽中m次,在这次及这次之前共k次连续未抽中
  21. double P[N_MAX + 1][M_MAX + 1][K_MAX + 1];
  22.  
  23. double Cal(int n, int m, int k)
  24. {
  25.     if (n < 0 || m < 0 || k < 0 || n > maxN || m > maxM || k > K_MAX)
  26.         return 0;
  27.     if (P[n][m][k] <= 1)
  28.         return P[n][m][k];
  29.     if (k == 0) //抽中
  30.     {
  31.         double temp = 0, tsum = 0;
  32.         for (int i = 0; i < K_MAX; i++)
  33.             tsum += Cal(n - 1, m - 1, i);
  34.         temp += tsum * P_WIN;
  35.         temp += Cal(n - 1, m - 1, 99) * 1.0;
  36.         P[n][m][k] = temp;
  37.         return temp;
  38.     }
  39.     else //没抽中
  40.     {
  41.         double temp = Cal(n - 1, m, k - 1) * (1 - P_WIN);
  42.         P[n][m][k] = temp;
  43.         return temp;
  44.     }
  45. }
  46.  
  47. double CalSum(int n, int m)
  48. {
  49.     double res = 0;
  50.     for (int i = 0; i <= K_MAX; i++)
  51.         res += Cal(n, m, i);
  52.     return res;
  53. }
  54.  
  55. double CalSumK(int n, int m)
  56. {
  57.     double res = 0;
  58.     for (int i = 0; i < K_MAX; i++)
  59.         res += Cal(n, m, i) * i;
  60.     return res;
  61. }
  62.  
  63. /*
  64. * arg1 : 抽取次数
  65. * arg2 : 抽中次数显示上限
  66. * [arg3] : 抽取前已有保底次数
  67. */
  68. int main(int argc, char *argv[])
  69. {
  70.     if (argc < 3)
  71.     {
  72.         cout << "Need more arg!" << endl;
  73.         return 0;
  74.     }
  75.     maxN = atoi(argv[1]);
  76.     maxM = atoi(argv[2]);
  77.     if (argc >= 4)
  78.         startK = atoi(argv[3]);
  79.     if (maxN > N_MAX || maxM > M_MAX || startK > K_MAX)
  80.     {
  81.         cout << "Out of range!" << endl;
  82.         return 0;
  83.     }
  84.  
  85.     memset(P, 0x42, sizeof(P));
  86.     P[0][0][startK] = 1;
  87.  
  88.     double restSum = 1.0;
  89.     cout << fixed << setprecision(8);
  90.  
  91.     for (int i = 0; i <= maxM; i++)
  92.     {
  93.         double temp = CalSum(maxN, i);
  94.         cout.width(2);
  95.         cout << i << ' ' << temp << ' ' << restSum << ' ' << (temp == 0 ? -1 : CalSumK(maxN, i) / temp) << endl;
  96.         restSum -= temp;
  97.     }
  98.  
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement