fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. /* LEGENDA:
  5. U-Górny zakres, D-Dolny zakres, sign-operator, dig-liczba, yn-operator logiczny(tak/nie), vector exc-wektor przechowujący wyjątki
  6. WUD-współczynnik nadawany na podstawie "sign" i "yn", T1-liczba testów, T2-liczba czynników, F-liczba kłamstw z rzędu,
  7. maxF-największa liczba kłamst z rzędu
  8. */
  9. bool CheckT(int &U, int &D, char &sign, int &dig, std::string &yn, std::vector<int> &exc, int &WUD) // sprawdzam czy nowy operator nie wychodzi poza zakresy, nadaje WUD i dodaje wyjątki
  10. {
  11. if (sign == '<' && yn == "tak")
  12. {
  13. WUD = 1;
  14. return true;
  15. }
  16. if (sign == '>' && yn == "nie")
  17. {
  18. WUD = 2;
  19. return true;
  20. }
  21. if (sign == '<' && yn == "nie")
  22. {
  23. WUD = 3;
  24. return true;
  25. }
  26. if (sign == '>' && yn == "tak")
  27. {
  28. WUD = 4;
  29. return true;
  30. }
  31. if (sign == '=' && yn == "tak")
  32. {
  33. WUD=5;
  34. if (dig <= U && dig >= D) // jeśli zawiera się w zbiorze zmienia zakresy na liczbę dig
  35. {
  36. U = dig;
  37. D = dig;
  38. return true;
  39. }
  40. else // jeśli się nie zawiera z zbiorach oznacza kłamstwo
  41. {
  42. return false;
  43. }
  44. }
  45. if ((sign == '=' && yn == "nie"))
  46. {
  47. WUD = 6;
  48. if (dig > U || dig < D) // jeśli wykracza poza zbiór nie jest uwzględniany jako wyjątek
  49. {
  50. return true;
  51. }
  52. else // jeśli zawiera się w zbiorze sprawdza czy znajduje się obecnie w vektorze
  53. {
  54. int size = exc.size();
  55. if (size)
  56. {
  57. for (int x : exc)
  58. {
  59. if (x == dig) // jeśli się znajduje nie dodaje go do "exc" i kończy funkcje
  60. {
  61. return true;
  62. break;
  63. }
  64. }
  65. }
  66. exc.push_back(dig); // nie występuje w vektorze i jest dodawany
  67. return true;
  68. }
  69. }
  70. return false;
  71. }
  72. void WUDa(int &U, int &D,int &WUD, int &dig) // funkcja korzystająca z współczynnika WUD zmieniająca zakresy
  73. {
  74. if(WUD!=6)
  75. {
  76. switch (WUD)
  77. {
  78. case 1:
  79. {
  80. U = dig - 1;
  81. break;
  82. }
  83. case 2:
  84. {
  85. U = dig;
  86. break;
  87. }
  88. case 3:
  89. {
  90. D = dig;
  91. break;
  92. }
  93. case 4:
  94. {
  95. D = dig + 1;
  96. break;
  97. }
  98. case 5:
  99. {
  100. D = dig;
  101. U = dig;
  102. break;
  103. }
  104. default:
  105. break;
  106. }
  107. }
  108. }
  109. void Fexe(int &U, int &D, int &dig, std::vector<int> &exc, int &WUD) // czyści wyjątki, zmienia zakres na podstawowy, a następnie wywołuje funkcje WUDa
  110. {
  111. exc.clear();
  112. D = 1;
  113. U = 1000000001;
  114. WUDa(U, D, WUD, dig);
  115. if(WUD==6) // jeśli nowe wyrażenie zawierało "=" i "nie", dodaje "dig" do wektora wyjątków
  116. {
  117. exc.push_back(dig);
  118. }
  119. }
  120. bool CheckF(int &U, int &D, char &sign, int &dig, std::string &yn, std::vector<int> &exc, int &WUD) // sprawdza warunki fałszu
  121. {
  122. if(U-D==exc.size()-1 && exc.size()!=0) // sprawdzam czy wszystkie mozliwe liczby zostaly zanegowane
  123. {
  124. return true;
  125. }
  126. else if(U<D)
  127. {
  128. return true;
  129. }
  130. else if(WUD==5 && (dig<D || dig>U)) // jeśli nowe wyrażenie zawierało "=" i "tak" i nie zawiera się w zbiorze oznacza kłamstwo
  131. {
  132. return true;
  133. }
  134. else if(WUD==6 && U==D && dig==U) // jeśli nowe wyrażenie zawierało "=" i "nie" i nowy "dig" i oba ekstrema wykresu są równe oznacza kłamstwo
  135. {
  136. return true;
  137. }
  138. if (dig > U || dig < D)
  139. {
  140. return false;
  141. }
  142. else
  143. {
  144. return false;
  145. }
  146. }
  147. int main()
  148. {
  149. std::ios_base::sync_with_stdio(0);
  150. int T;
  151. std::cin >> T;
  152. while (T--)
  153. {
  154. int T2, dig, F = 0, maxF = 0;
  155. std::vector<int> exc;
  156. std::cin >> T2;
  157. char sign;
  158. std::string yn;
  159. int U = 1000000001, D = 1, WUD = 0;
  160. while (T2--)
  161. {
  162. std::cin >> sign >> dig >> yn;
  163. if (CheckT(U, D, sign, dig, yn, exc, WUD))//sprawdzam czy spełnia warunki prawdy
  164. {
  165. WUDa(U, D, WUD, dig);//manipuluje zakresami
  166. F=0;
  167. }
  168. if (CheckF(U, D, sign, dig, yn, exc, WUD))//sprawdzam czy spełnia warunki fałszu
  169. {
  170. F++;
  171. Fexe(U, D, dig, exc, WUD);
  172. }
  173. if (maxF < F)
  174. {
  175. maxF = F;
  176. }
  177. // ----------------------------------------------------------------------------
  178. std::cout << "KOMENTARZ: zakres gorny: " << U << " zakres dolny: " << D << " bledy: " << F <<" Wyjatki: "<<'\n';
  179. for(int i : exc)
  180. {
  181. std::cout<<i<<' ';
  182. }
  183. if(!exc.size())
  184. {
  185. std::cout<<" ---";
  186. }
  187. std::cout<<'\n';
  188. // ----------------------------------------------------------------------------
  189. }
  190. std::cout << maxF << '\n';
  191. }
  192. }
Success #stdin #stdout 0s 4452KB
stdin
3
2
< 100 nie
> 100 nie
3
< 2 tak
> 4 tak
= 3 nie
6
< 2 tak
> 1 tak
= 1 tak
= 1 tak
> 1 tak
= 1 tak
stdout
KOMENTARZ: zakres gorny: 1000000001 zakres dolny: 100 bledy: 0 Wyjatki: 
 ---
KOMENTARZ: zakres gorny: 100 zakres dolny: 100 bledy: 0 Wyjatki: 
 ---
0
KOMENTARZ: zakres gorny: 1 zakres dolny: 1 bledy: 0 Wyjatki: 
 ---
KOMENTARZ: zakres gorny: 1000000001 zakres dolny: 5 bledy: 1 Wyjatki: 
 ---
KOMENTARZ: zakres gorny: 1000000001 zakres dolny: 5 bledy: 0 Wyjatki: 
 ---
1
KOMENTARZ: zakres gorny: 1 zakres dolny: 1 bledy: 0 Wyjatki: 
 ---
KOMENTARZ: zakres gorny: 1000000001 zakres dolny: 2 bledy: 1 Wyjatki: 
 ---
KOMENTARZ: zakres gorny: 1 zakres dolny: 1 bledy: 2 Wyjatki: 
 ---
KOMENTARZ: zakres gorny: 1 zakres dolny: 1 bledy: 0 Wyjatki: 
 ---
KOMENTARZ: zakres gorny: 1000000001 zakres dolny: 2 bledy: 1 Wyjatki: 
 ---
KOMENTARZ: zakres gorny: 1 zakres dolny: 1 bledy: 2 Wyjatki: 
 ---
2