Advertisement
_rashed

HackerRank Vertical Sticks

Jul 27th, 2022
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.95 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. string ltrim(const string &);
  6. string rtrim(const string &);
  7. vector<string> split(const string &);
  8.  
  9. /*
  10.  * Complete the 'solve' function below.
  11.  *
  12.  * The function is expected to return a DOUBLE_ARRAY.
  13.  * The function accepts INTEGER_ARRAY y as parameter.
  14.  */
  15.  
  16.  double mem[51][51][51][51];
  17.  double fact[51];
  18.  int arr[50];
  19.  
  20.  double get_ans(int idx, int l, int ge, int v) {
  21.      if(idx == 0) {
  22.          return v*fact[l+ge];
  23.      }
  24.      if(mem[idx][l][ge][v] != -1) {
  25.          return mem[idx][l][ge][v];
  26.      }
  27.      double &ret = mem[idx][l][ge][v];
  28.      double l_p = 1;
  29.      ret = 0;
  30.      if(ge > 0) {
  31.          ret += v*ge*fact[l+ge-1];
  32.      }
  33.      if(l > 0) {
  34.          ret += l*get_ans(idx-1,l-1,ge,v+1);
  35.      }
  36.      /*for(int i = 0; i <= idx; i++) {
  37.          if(i == idx) {
  38.              ret += l_p*fact[l+ge]*(i+1);
  39.              break;
  40.          }
  41.          if(ge > 0) {
  42.              ret += l_p*ge*fact[l+ge-1]*(i+1);
  43.          }
  44.          if(l == 0) {
  45.              break;
  46.          }
  47.          l--;
  48.          l_p++;
  49.      }*/
  50.      return ret;
  51.  }
  52.  
  53. vector<double> solve(vector<int> y) {
  54.     for(int i = 0; i < 51; i++) {
  55.         for(int j = 0; j < 51; j++) {
  56.             for(int k = 0; k < 51; k++) {
  57.                 for(int v = 0; v < 51; v++)
  58.                     mem[i][j][k][v] = -1;
  59.             }
  60.         }
  61.     }
  62.     fact[0] = 1;
  63.     for(int i = 1; i < 51; i++) {
  64.         fact[i] = i * fact[i-1];
  65.     }
  66.     vector<double> ans;
  67.     //cout << "here at t = " << t << "\n";
  68.     int n = y.size();
  69.     double num = 0;
  70.     for(int i = 0; i < n; i++) {
  71.         int l = 0;
  72.         int ge = 0;
  73.         for(int j = 0; j < n; j++) {
  74.             if(i != j) {
  75.                 if(y[j] < y[i]) {
  76.                     l++;
  77.                 }
  78.                 else {
  79.                     ge++;
  80.                 }
  81.             }
  82.         }
  83.         for(int idx = 0; idx < n; idx++) {
  84.             num += get_ans(idx,l,ge,1);
  85.             //cout << "get_ans(" << idx << " = " << get_ans(idx,l,ge,1) << "\n";
  86.         }
  87.         //cout << "num is " << num << "\n";
  88.     }
  89.     cout.precision(2);
  90.     cout << fixed;
  91.     num /= fact[n];
  92.     ans.push_back(num);
  93.     //cout << "ans is " << num << "\n";
  94.     return ans;
  95. }
  96.  
  97. int main()
  98. {
  99.     ofstream fout(getenv("OUTPUT_PATH"));
  100.  
  101.     string t_temp;
  102.     getline(cin, t_temp);
  103.  
  104.     int t = stoi(ltrim(rtrim(t_temp)));
  105.     fout.precision(2);
  106.     fout << fixed;
  107.     for (int t_itr = 0; t_itr < t; t_itr++) {
  108.         string y_count_temp;
  109.         getline(cin, y_count_temp);
  110.  
  111.         int y_count = stoi(ltrim(rtrim(y_count_temp)));
  112.  
  113.         string y_temp_temp;
  114.         getline(cin, y_temp_temp);
  115.  
  116.         vector<string> y_temp = split(rtrim(y_temp_temp));
  117.  
  118.         vector<int> y(y_count);
  119.  
  120.         for (int i = 0; i < y_count; i++) {
  121.             int y_item = stoi(y_temp[i]);
  122.  
  123.             y[i] = y_item;
  124.         }
  125.  
  126.         vector<double> result = solve(y);
  127.  
  128.         for (size_t i = 0; i < result.size(); i++) {
  129.             fout << result[i];
  130.  
  131.             if (i != result.size() - 1) {
  132.                 fout << "\n";
  133.             }
  134.         }
  135.  
  136.         fout << "\n";
  137.     }
  138.  
  139.     fout.close();
  140.  
  141.     return 0;
  142. }
  143.  
  144. string ltrim(const string &str) {
  145.     string s(str);
  146.  
  147.     s.erase(
  148.         s.begin(),
  149.         find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(isspace)))
  150.     );
  151.  
  152.     return s;
  153. }
  154.  
  155. string rtrim(const string &str) {
  156.     string s(str);
  157.  
  158.     s.erase(
  159.         find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(),
  160.         s.end()
  161.     );
  162.  
  163.     return s;
  164. }
  165.  
  166. vector<string> split(const string &str) {
  167.     vector<string> tokens;
  168.  
  169.     string::size_type start = 0;
  170.     string::size_type end = 0;
  171.  
  172.     while ((end = str.find(" ", start)) != string::npos) {
  173.         tokens.push_back(str.substr(start, end - start));
  174.  
  175.         start = end + 1;
  176.     }
  177.  
  178.     tokens.push_back(str.substr(start));
  179.  
  180.     return tokens;
  181. }
  182.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement