Advertisement
999ms

Untitled

May 2nd, 2020
619
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.18 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define all(x) begin(x), end(x)
  3.  
  4. using namespace std;
  5. using ll = long long;
  6.  
  7. void InitIO(std::string name = "", std::string nameout = "") {
  8.     ios_base::sync_with_stdio(false);
  9.     cin.tie(nullptr);
  10.     cout.tie(nullptr);
  11.     if (name.size() && nameout.size()) {
  12.         assert(freopen((name + ".txt").c_str(), "r", stdin));
  13.         assert(freopen((nameout + ".txt").c_str(), "w", stdout));
  14.     } else if (name.size()) {
  15.         assert(freopen((name + ".in").c_str(), "r", stdin));
  16.         assert(freopen((name + ".out").c_str(), "w", stdout));
  17.     }
  18. }
  19.  
  20. ll Stoll(string s) {
  21.     if (s.size() == 0) return 0;
  22.     return stoll(s);
  23. }
  24.  
  25. ll mypow10(int x) {
  26.     ll ans = 1;
  27.     while (x--) {
  28.         ans *= 10;
  29.     }
  30.     return ans;
  31. }
  32.  
  33.  
  34. string Solve(int u, vector<pair<ll, string>>& arr) {
  35.     const int n = 1e4;
  36.     vector<vector<char>> cmp(u + 1);
  37.     string tmp;
  38.     for (int i = 0; i < n; i++) {
  39.         tmp += arr[i].second;
  40.     }
  41.     sort(all(tmp));
  42.     tmp.erase(unique(all(tmp)), tmp.end());
  43.  
  44.     vector<int> mp(256);
  45.     vector<char> rmp;
  46.     for (int i = 0; i < int(tmp.size()); i++) {
  47.         mp[tmp[i]] = i;
  48.         rmp.push_back(tmp[i]);
  49.     }
  50.  
  51.     vector<vector<double>> p(10, vector<double>(10));
  52.  
  53.     for (int i = 0; i < n; i++) {
  54.         int k = arr[i].second.size();
  55.         string s = to_string(arr[i].first);
  56.         if (arr[i].first == -1) {
  57.             char ch = arr[i].second[0];
  58.             double prob = (mypow10(u) - mypow10(int(arr[i].second.size()))) * 1.0 / mypow10(u);
  59.             for (int j = 1; j < 10; j++) {
  60.                 p[mp[ch]][j] += prob / 9;
  61.             }
  62.             vector<double> kek(10);
  63.             for (int first = 1; first < 10; first++) {
  64.                 double lst = 0.5 / first;
  65.                 double sum = first - 1 + lst;
  66.                 for (int j = 1; j < first; j++) {
  67.                     kek[j] += 1.0 / sum;
  68.                 }
  69.                 kek[first] += lst / sum;
  70.             }
  71.             for (int j = 1; j < 10; j++) kek[j] /= 9;
  72.             for (int j = 1; j < 10; j++) {
  73.                 p[mp[ch]][j] += kek[j];
  74.             }
  75.         } else {
  76.             if (k < int(s.size())) {
  77.                 char ch = arr[i].second[0];
  78.                 for (int j = 1; j < 10; j++) {
  79.                     p[mp[ch]][j] += 1.0 / 9;
  80.                 }
  81.             } else {
  82.                 char ch = arr[i].second[0];
  83.                 int first = s[0] - '0';
  84.  
  85.                 double lst = 1.0 * (Stoll(s.substr(1, int(s.size()) - 1)) + 1) / arr[i].first;
  86.                 double sum = first - 1 + lst;
  87.  
  88.                 vector<double> kek(first + 1);
  89.                 for (int j = 1; j < first; j++) {
  90.                     kek[j] = 1.0 / sum;
  91.                 }
  92.                 kek[first] = lst / sum;
  93.                 for (int j = 1; j <= first; j++) {
  94.                     p[mp[ch]][j] += kek[j];
  95.                 }
  96.             }
  97.         }
  98.     }
  99.     int zero = 0;
  100.  
  101.     for (int i = 0; i < 10; i++) {
  102.         if (accumulate(all(p[i]), 0.0) == 0) {
  103.             zero = i;
  104.             break;
  105.         }
  106.     }
  107.     string ans = "";
  108.     ans.push_back(tmp[zero]);
  109.  
  110.     vector<int> ind;
  111.     for (int i = 0; i < 10; i++) {
  112.         if (i == zero) continue;
  113.         ind.push_back(i);
  114.     }
  115.     double cur = 0;
  116.     string suff;
  117.  
  118.     do {
  119.         double val = 0;
  120.         for (int i = 0; i < int(ind.size()); i++) {
  121.             val += p[ind[i]][i + 1];
  122.         }
  123.         if (val > cur) {
  124.             cur = val;
  125.             suff = "";
  126.             for (int i = 0; i < int(ind.size()); i++) {
  127.                 suff.push_back(tmp[ind[i]]);
  128.             }
  129.         }
  130.     } while (next_permutation(all(ind)));
  131.     return ans + suff;
  132. }
  133.  
  134.  
  135. void Solve() {
  136.     int t;
  137.     cin >> t;
  138.     for (int test = 1; test <= t; test++) {
  139.         int u;
  140.         cin >> u;
  141.         vector<pair<ll, string>> arr;
  142.         for (int i = 0; i < 1e4; i++) {
  143.             ll a;
  144.             string b;
  145.             cin >> a >> b;
  146.             arr.emplace_back(a, b);
  147.         }
  148.         string res = Solve(u, arr);
  149.         cout << "Case #" << test << ": " << res << '\n';
  150.     }
  151. }
  152.  
  153. int main() {
  154.     InitIO();
  155.     Solve();
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement