Advertisement
KiK0S

huff

Feb 21st, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4.  
  5. struct V{
  6. double val;
  7. int l;
  8. int r;
  9. };
  10. vector<V> g;
  11. vector<string> ans;
  12. void dfs(int v, string cur){
  13. if(g[v].l == -1){
  14. ans[v] = cur;
  15. return;
  16. }
  17. dfs(g[v].l, cur + "1");
  18. dfs(g[v].r, cur + "0");
  19. }
  20.  
  21. signed main() {
  22. //freopen(".in", "r", stdin);
  23. //freopen(".out", "w", stdout);
  24. ios_base::sync_with_stdio(0);
  25. cin.tie(0);
  26. cout.tie(0);
  27. multiset<pair<double,int>> s;
  28. ans.resize(1<<10);
  29. for(int i = 0; i < (1<<10); i++){
  30. double ver = 1;
  31. for(int j = 0; j < 10; j++){
  32. if(i & (1<<j)){
  33. ver *= 0.1;
  34. }
  35. else ver *= 0.9;
  36. }
  37. g.push_back((V){ver, -1, -1});
  38. s.insert({ver, i});
  39. }
  40. while(s.size() > 1){
  41. pair<double, int> F = *s.begin();
  42. s.erase(*s.begin());
  43. pair<double,int> S = *s.begin();
  44. s.erase(*s.begin());
  45. g.push_back((V){F.first + S.first, F.second, S.second});
  46. s.insert({F.first + S.first, g.size() - 1});
  47. }
  48. dfs((*s.begin()).second, "");
  49. double mat = 0;
  50. for(int i = 0; i < (1<<10); i++){
  51. for(int j = 9; j >= 0; j--){
  52. cout << ((int)1 &(i>>j));
  53. }
  54. cout << '\t';
  55. cout << ans[i]<<'\n';
  56. mat += g[i].val * ans[i].size();
  57. }
  58. cout << mat;
  59. return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement