Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. #define FILEA "/home/prance/c/patyk/A.txt"
  7.  
  8. using namespace std;
  9.  
  10. vector<unsigned int> read_from_file() {
  11. vector<unsigned int> A;
  12. unsigned int number;
  13. ifstream file(FILEA);
  14. while (file >> number) A.push_back(number);
  15. file.close();
  16. return A;
  17. }
  18.  
  19. bool find_k(unsigned long A_size) {
  20. const unsigned long dAsize = 2 * A_size;
  21. unsigned int i = 0;
  22. for (; i < dAsize; i++)
  23. if ((i + 1) * (i + 2) == dAsize)
  24. break;
  25. if (i == dAsize) {
  26. cout << "Nie znaleziono calkowitej liczby ciec, zadana instancja jest bledna" << endl;
  27. exit(1);
  28. }
  29. return true;
  30. }
  31.  
  32. void erase(vector<unsigned int> &a, unsigned int r){
  33. auto it = find(a.begin(), a.end(), r);
  34. if (it != a.end()) a.erase(it);
  35. }
  36.  
  37. vector<unsigned int> map(vector<unsigned int> A, unsigned int k) {
  38. vector<unsigned int> temp;
  39. vector<vector<unsigned int>> used;
  40. vector<unsigned int> result;
  41.  
  42. if (is_sorted(A.begin(), A.end())) {
  43. auto it = A.end() - 1;
  44. auto it2 = A.end() - 2;
  45. result.push_back(*it - *it2);
  46. erase(A, *it - *it2);
  47. int max_sum = A.back();
  48. for (auto candidate = A.begin(); candidate != A.end(); ++candidate) {
  49. if (result.size() == k + 1 || A.empty()) {
  50. return result;
  51. }
  52. bool sum_found = true;
  53. int last;
  54. temp.clear();
  55. int sum = *candidate;
  56. for (auto res = result.end(); res != result.begin(); --res) {
  57. sum += *res;
  58. if (sum > max_sum) {
  59. A.push_back(result.back());
  60. last = result.back();
  61. result.pop_back();
  62. if (!used.empty())
  63. for (auto &u : used.back()) {
  64. A.push_back(u);
  65. }
  66. used.pop_back();
  67. sort(A.begin(), A.end());
  68. for (auto it = A.begin(); it != A.end(); ++it) {
  69. if (*it > last) {
  70. res = it;
  71. break;
  72. }
  73. }
  74. continue;
  75. }
  76. if (find(A.begin(), A.end(), sum) == A.end()) {
  77. sum_found = false;
  78. break;
  79. }
  80. temp.push_back(sum);
  81. erase(A, sum);
  82. }
  83. if (!sum_found) {
  84. for (auto &sums : temp)
  85. A.push_back(sums);
  86. continue;
  87. } else {
  88. result.push_back(*candidate);
  89. erase(A, *candidate);
  90. used.push_back(temp);
  91. candidate = A.begin() + 1;
  92. continue;
  93. }
  94. }
  95. }
  96.  
  97. }
  98.  
  99. int main() {
  100. vector<unsigned int> A;
  101. A = read_from_file();
  102. cout << "dlugosc wektora: " << A.size() << endl;
  103. int k = find_k(A.size());
  104. cout << "k: " << k << endl << "zawartosc wektora: ";
  105. for (auto &a: A) cout << a << " ";
  106. cout << endl;
  107. vector<unsigned int> result = map(A, k);
  108. cout << "długość rozwiązania: " << result.size() << endl << "Rozwiązanie: ";
  109. for (auto &r: result) {
  110. cout << r << " ";
  111. }
  112. cout << endl;
  113.  
  114. return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement