matbensch

ICPC 2022 A Solution

Jan 15th, 2023
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. int n;
  7. vector<double> p;
  8. vector<double> dp;
  9.  
  10. double sim(int m)
  11. {
  12.     if(dp[m]!=-1) return dp[m];
  13.  
  14.     int numLeft = 0;
  15.     for(int i=0;i<n;i++)
  16.     {
  17.         if((m>>i) & 1) continue;
  18.         numLeft++;
  19.     }
  20.     if(numLeft<=2) return dp[m] = 0;
  21.  
  22.     double pAllUp = 1;
  23.     double pAllDown = 1;
  24.     for(int i=0;i<n;i++)
  25.     {
  26.         if((m>>i) & 1) continue;
  27.         pAllUp *= p[i];
  28.         pAllDown *= (1-p[i]);
  29.     }
  30.  
  31.     double pElimination = 0;
  32.     for(int i=0;i<n;i++)
  33.     {
  34.         if( (m>>i) & 1 ) continue;
  35.         pElimination += pAllUp/p[i] * (1-p[i]);
  36.         pElimination += pAllDown/(1-p[i]) * p[i];
  37.     }
  38.  
  39.     double ev = 1/pElimination;
  40.     for(int i=0;i<n;i++)
  41.     {
  42.         if( (m>>i) & 1 ) continue;
  43.         double piEliminated = pAllUp/p[i] * (1-p[i]) + pAllDown/(1-p[i]) * p[i];
  44.         ev += piEliminated / pElimination * sim( m | (1<<i) );
  45.     }
  46.  
  47.     return dp[m] = ev;
  48.  
  49. }
  50.  
  51. int main()
  52. {
  53.     cin >> n;
  54.     p.resize(n);
  55.     for(int i=0;i<n;i++) cin >> p[i];
  56.     dp.resize(1<<n, -1);
  57.  
  58.     printf("%.10f\n", sim(0));
  59. }
Add Comment
Please, Sign In to add comment