Advertisement
Guest User

Untitled

a guest
Nov 24th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.20 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int n = 5; //Number of channels
  6. int l = 50; //Length of message
  7. int e = 2; //Error count
  8. double signalPercent = 0.6; //Percent of signal
  9. double energy[100]; //Energy required
  10. int lv = 15; //Maximum levels
  11. double a[100][100]; //Probabilities for numbers in signal
  12. int nl = 1000; //Noise length
  13. double b[100][100]; //Probabilities for errors in signal
  14.  
  15. int thres[100]; //Thresholds for each channel
  16.  
  17. double rrr[100][100];
  18. void readInput() {
  19. cin >> n >> l >> e >> signalPercent;
  20.  
  21. for(int i = 0; i < n; i++) {
  22. cin >> energy[i];
  23. }
  24.  
  25. cin >> lv;
  26. for(int i = 0; i < lv; i++) {
  27. int x; cin >> x;
  28. }
  29.  
  30. for(int i = 0; i < n; i++) {
  31. for(int j = 0; j < lv; j++) {
  32. cin >> a[i][j];
  33. }
  34. }
  35.  
  36. cin >> nl;
  37. for(int i = 0; i < n; i++) {
  38. for(int j = 0; j < nl; j++) {
  39. int noise;
  40. cin >> noise;
  41. b[i][noise] += 0.001;
  42. }
  43. }
  44. }
  45.  
  46. void findThresholds() {
  47. for(int ch = 0; ch < n; ch++) {
  48. double bestR = 10000.0;
  49. int bestN = 0;
  50.  
  51. for(int m = 0; m < lv; m++) {
  52. double r = 0.0, k = 0.0, q = 0.0;
  53. for(int i = m; i < lv; i++) {
  54. k += b[ch][i];
  55. }
  56. for(int i = 0; i < m; i++) {
  57. double temp = 0.0;
  58. for(int j = 0; i + j < m; j++) {
  59. temp += a[ch][j];
  60. }
  61. q += b[ch][i] * temp;
  62. }
  63.  
  64. r = k + q;
  65. rrr[ch][m] = r;
  66. if(bestR > r) {
  67. bestR = r;
  68. bestN = m;
  69. }
  70. }
  71.  
  72. thres[ch] = bestN;
  73. }
  74. }
  75.  
  76. double calculate(vector<bool> enabled) {
  77. double p = 1.0;
  78.  
  79. for(int i = 0; i < enabled.size(); i++) {
  80. if(enabled[i]) {
  81. p *= rrr[i][thres[i]];
  82. }
  83. }
  84.  
  85. double q = 1.0 - p;
  86.  
  87. double temp = 0.0;
  88. double d = l * (l - 1) / 2;
  89. d *= p * p;
  90. for(int i = 0; i < (l - 2); i++) { d *= q; }
  91. temp += d;
  92. d = l;
  93. d *= p;
  94. for(int i = 0; i < l - 1; i++) { d *= q; }
  95. temp += d;
  96. d = 1;
  97. for(int i = 0; i < l; i++) { d *= q; }
  98. temp += d;
  99. /*for(int i = 0; i < enabled.size(); i++) {
  100. cout << enabled[i];
  101. }
  102. cout << " " << temp << endl;*/
  103. if(temp < 0.99) {
  104. return -1;
  105. }
  106. else {
  107. double sum = 0.0;
  108. for(int i = 0; i < enabled.size(); i++) {
  109. sum += energy[i];
  110. }
  111. return sum;
  112. }
  113. }
  114.  
  115. vector<bool> usedChannels;
  116. double usedEnergy = 1239471212.0;
  117. void mask() {
  118. double minAns = 555555.0;
  119. for(int i = 0; i < (1 << n); i++) {
  120. vector<bool> enabled;
  121. for(int j = n - 1; j >= 0; j--) {
  122. if((i & (1 << j)) != 0) {
  123. enabled.push_back(true);
  124. }
  125. else {
  126. enabled.push_back(false);
  127. }
  128. }
  129.  
  130. double ans = calculate(enabled);
  131. //cout << ans << endl;
  132. if(ans < usedEnergy && ans != -1) {
  133. usedEnergy = ans;
  134. usedChannels = enabled;
  135. }
  136. }
  137. }
  138. int main() {
  139. //freopen("input3.dat", "r", stdin);
  140.  
  141. readInput();
  142. findThresholds();
  143. mask();
  144.  
  145. for(int i = 0; i < n; i++) {
  146. cout << usedChannels[i] << " " << thres[i] << endl;
  147. }
  148. cout << usedEnergy;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement