fork(2) download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <math.h>
  4.  
  5. using namespace std;
  6. int odwaznikA, odwaznikB, lek;
  7. int i=0, j=0, heavy, light, temp, counter, repeat;
  8. double licznik=0;
  9. int diff [500000] = {};
  10. bool flag = false;
  11. bool cond;
  12.  
  13. void swap1(int iarg, int jarg) {
  14. if (heavy == odwaznikB) {
  15. temp = iarg;
  16. i = jarg;
  17. j = temp;
  18. }
  19. }
  20. void swap2(int iarg, int jarg) {
  21. if (heavy == odwaznikA) {
  22. temp = iarg;
  23. i = jarg;
  24. j = temp;
  25. }
  26. }
  27.  
  28. int main()
  29. {
  30. int odwaznikATab [] = {3,700,500,500,275,275,648,3,2,5,200,375,1,100,1693,50};
  31. int odwaznikBTab [] = {9,300,200,200,110,110,375,1,5,2,500,648,3,200,2156,5};
  32. int lekTab [] = {11,200,300,500,330,385,4002,10000,10,10,500,4002,10000,100,5688,120};
  33. int iLength = sizeof(odwaznikATab)/sizeof(odwaznikATab[0]);
  34. //for (int c=0;c<iLength;c++) {
  35. while (1) {
  36. cin>>odwaznikA>>odwaznikB>>lek;
  37. //odwaznikA = odwaznikATab[c];
  38. //odwaznikB = odwaznikBTab[c];
  39. //lek = lekTab[c];
  40. if ((odwaznikA == 0 && odwaznikB == 0 && lek == 0) ||
  41. ((odwaznikA > 50000 || odwaznikA <= 0) || (odwaznikB > 50000 || odwaznikB <= 0) || (lek < 0 || lek > 50000)) ||
  42. (odwaznikA == odwaznikB || licznik > pow(10, 4))
  43. )
  44. {
  45. break;
  46. }
  47. i=0;j=0;counter=0;repeat=0;flag = false;
  48. heavy = (odwaznikA > odwaznikB) ? odwaznikA : odwaznikB;
  49. light = (odwaznikA < odwaznikB) ? odwaznikA : odwaznikB;
  50. //logic here
  51. while (1) {
  52. cond = ((i*odwaznikA == j*odwaznikB + lek || j*odwaznikA == i*odwaznikB + lek) || (i*odwaznikB == j*odwaznikA + lek || j*odwaznikB == i*odwaznikA + lek));
  53. //if sum of two weights is equal medicament
  54. if (heavy+light == lek) {
  55. j=1;
  56. i=1;
  57. flag = true;
  58. }
  59.  
  60. //some conditions
  61. else if (((i*light+lek)%heavy==0 && light != 1) && !cond) {
  62. if (lek == heavy) {
  63. i++;
  64. swap1(i,j);
  65. }
  66. else {
  67. while (i*light+lek != j*heavy) {
  68. ++j;
  69. }
  70. swap2(i,j);
  71. }
  72. flag = true;
  73. }
  74. else if (((i*heavy+lek)%light==0 && light != 1) && !cond) {
  75. if (lek == light) {
  76. i++;
  77. swap2(i,j);
  78. }
  79.  
  80. else if (i*heavy + j*light < lek && lek%light==0 && heavy%light==0) {
  81. while ((i+1)*heavy < lek) {
  82. ++i;
  83. }
  84. while (i*heavy + j*light < lek) {
  85. ++j;
  86. }
  87. swap1(i,j);
  88. }
  89.  
  90. else {
  91. while (i*heavy+lek != j*light) {
  92. ++j;
  93. }
  94. swap1(i,j);
  95. }
  96. flag = true;
  97. }
  98.  
  99. else if (i*heavy+(j+1)*light == lek || i*light+(j+1)*heavy == lek) {
  100. j++;
  101. flag = true;
  102. swap1(i,j);
  103. }
  104.  
  105. if (cond || flag) {
  106. if (!flag) {
  107. swap1(i,j);
  108. }
  109. cout <<i<<" "<<j<< endl;
  110. i=0;j=0;repeat=0;counter=0;
  111. break;
  112. }
  113.  
  114. if ((i*heavy > j*light + lek)) {
  115. j++;
  116. }
  117. else {
  118. i++;
  119. }
  120.  
  121. diff[counter++] = abs(i*heavy - j*light + lek);
  122. if (counter > 100 && counter <= sizeof(diff)/sizeof(diff[0])) {
  123. if (diff[counter-8] == diff[counter-4] && diff[counter-7] == diff[counter-3] &&
  124. diff[counter-6] == diff[counter-2] && diff[counter-5] == diff[counter-1]) {
  125. ++repeat;
  126. if (repeat > 50) {
  127. cout << "BRAK" << endl;
  128. repeat=0;
  129. break;
  130. }
  131. }
  132. }
  133. }
  134. //}
  135. ++licznik;
  136. }
  137. return 0;
  138. }
Success #stdin #stdout 0s 5428KB
stdin
700 300 200
500 200 300
500 200 500
275 110 330
275 110 385
648 375 4002
3 1 10000
5 2 10
2 5 10
3 9 11
33 99 111
347 876 8374
134 92 8788
0 0 0
stdout
1 3
1 1
1 0
0 3
1 1
49 74
3333 1
2 0
0 2
BRAK
BRAK
62 15
12 113