Advertisement
georgiy110802

Стресс тест

Jan 6th, 2022
1,128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.90 KB | None | 0 0
  1. // Стресс-тестирование
  2. -----------------------------------------------------------------------
  3. // задача А+Б шаблон
  4.  
  5. std::mt19937 ran(time(0));
  6.  
  7. int irand(int a, int b) {
  8.     return a + ran() % (b - a + 1);
  9. }
  10.  
  11. struct Test {
  12.     int a, b;
  13. };
  14.  
  15. struct Answer {
  16.     bool correct = true;
  17.     int wrongAnswer, rightAnswer;
  18. };
  19.  
  20. Test gen() {
  21.     return {irand(1, 10), irand(1, 10)};
  22. }
  23.  
  24. int wrong_answer(Test &a) {
  25.     return (a.a + a.b) % 15;
  26. }
  27.  
  28. int correct_answer(Test &a) {
  29.     return a.a + a.b;
  30. }
  31.  
  32. Answer check(Test& a) {
  33.     int correctAnswer = correct_answer(a);
  34.     int wrongAnswer = wrong_answer(a);
  35.     return {correctAnswer == wrongAnswer, wrongAnswer, correctAnswer};
  36. }
  37.  
  38. int main() {
  39.     int countTest;
  40.     cin >> countTest;
  41.     while (countTest--) {
  42.         Test a = gen();
  43.         auto test = check(a);
  44.         if (!test.correct) {
  45.             cout << "Wrong answer! \nTest: " << a.a << " " << a.b << "\n";
  46.             cout << "Participant: " << test.wrongAnswer << "\nJury: " << test.rightAnswer << "\n\n";
  47.         } else {
  48.             cout << "Accepted! \nTest: " << a.a << " " << a.b << "\n\n";
  49.         }
  50.     }
  51. }
  52.  
  53. /*
  54.     Что писать на олимпиаде?
  55.     1) У вас скорее всего написано решение на частичный балл
  56.     2) Вы уже написали решение, которое получило WA.
  57.     3) Значит осталось немного. Генератор тестов
  58.     4) Функция check на 3-4 строки
  59.     5) Функция main()
  60.     Пишется это минут 5-10
  61.    
  62.     Что не получится отдебагать стрессами?
  63.     1) Вердикты TL, ML
  64.     2) Маловероятно получится отдебагать RE, если постараться, то можно(имеется ввиду, выход за предел индекса), можно попробовать найти именно тест.
  65.     3) Может быть такое, что у вас переполнение, его тоже не отдебажишь
  66.    
  67.     Основная задача - это фикс WA на маленьких тестах, то есть поиск какого-то минимального теста с помощью генерации.
  68.    
  69.     ДЗ: использовать это при решении домашних контестов
  70. */
  71.  
  72. ------------------------------------------------------------------------------------------------------
  73. /*
  74. Задача про монетки
  75. Есть какая-то сумма W, а также есть n монеток и необходимо минимальным количеством монеток разменять сумму W.
  76. Монетки могут повторятся.
  77. Входные данные
  78. 1 строка два числа n и w
  79. 2 строка n чисел - монетки
  80. */
  81.  
  82. std::mt19937 ran(time(0));
  83.  
  84. int irand(int a, int b) {
  85.     return a + ran() % (b - a + 1);
  86. }
  87.  
  88. struct Test {
  89.     int n, w;
  90.     vector<int> coins;
  91. };
  92.  
  93. struct Answer {
  94.     bool correct = true;
  95.     int wrongAnswer, rightAnswer;
  96. };
  97.  
  98. Test gen() {
  99.     Test ready;
  100.     ready.n = irand(1, 5);
  101.     ready.w = irand(5, 20);
  102.     ready.coins.resize(ready.n);
  103.     for (int i = 0; i < ready.n; ++i) {
  104.         ready.coins[i] = irand(1, 6);
  105.     }
  106.     return ready;
  107. }
  108.  
  109. int wrong_answer(Test a) {
  110.     sort(a.coins.begin(), a.coins.end());
  111.     int ans = 0;
  112.     for (int i = a.coins.size() - 1; i >= 0; i--) {
  113.         while (a.w >= a.coins[i]) {
  114.             ans++;
  115.             a.w -= a.coins[i];
  116.         }
  117.     }
  118.     if (a.w > 0) {
  119.         return -1;
  120.     }
  121.     return ans;
  122. }
  123.  
  124. int correct_answer(Test &a) {
  125.     int INF = 1e9;
  126.     vector<int> summ(a.w + 1, INF);
  127.     summ[0] = 0;
  128.     for (int i = 1; i < a.w + 1; ++i) {
  129.         for (auto j : a.coins) {
  130.             if (i - j >= 0 && summ[i - j] + 1 < summ[i]) {
  131.                 summ[i] = summ[i - j] + 1;
  132.             }
  133.         }
  134.     }
  135.     if (summ[a.w] == INF) {
  136.         return -1;
  137.     }
  138.     return summ[a.w];
  139. }
  140.  
  141. ostream& operator<<(ostream& out, Test &t) {
  142.     out << t.n << " " << t.w << "\n";
  143.     for (int i : t.coins) {
  144.         out << i << " ";
  145.     }
  146.     out << "\n";
  147.     return out;
  148. }
  149.  
  150. Answer check(Test &a) {
  151.     int correctAnswer = correct_answer(a);
  152.     int wrongAnswer = wrong_answer(a);
  153.     return {correctAnswer == wrongAnswer, wrongAnswer, correctAnswer};
  154. }
  155.  
  156. int main() {
  157.     int countTest;
  158.     cin >> countTest;
  159.     while (countTest--) {
  160.         Test a = gen();
  161.         auto test = check(a);
  162.         if (!test.correct) {
  163.             cout << "Wrong answer! \nTest: \n" << a;
  164.             cout << "Participant: " << test.wrongAnswer << "\nJury: " << test.rightAnswer << "\n\n";
  165.         } else {
  166.             cout << "Accepted!" << "\nTest:\n" << a << "\n";
  167.         }
  168.     }
  169. }
  170.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement