Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Стресс-тестирование
- -----------------------------------------------------------------------
- // задача А+Б шаблон
- std::mt19937 ran(time(0));
- int irand(int a, int b) {
- return a + ran() % (b - a + 1);
- }
- struct Test {
- int a, b;
- };
- struct Answer {
- bool correct = true;
- int wrongAnswer, rightAnswer;
- };
- Test gen() {
- return {irand(1, 10), irand(1, 10)};
- }
- int wrong_answer(Test &a) {
- return (a.a + a.b) % 15;
- }
- int correct_answer(Test &a) {
- return a.a + a.b;
- }
- Answer check(Test& a) {
- int correctAnswer = correct_answer(a);
- int wrongAnswer = wrong_answer(a);
- return {correctAnswer == wrongAnswer, wrongAnswer, correctAnswer};
- }
- int main() {
- int countTest;
- cin >> countTest;
- while (countTest--) {
- Test a = gen();
- auto test = check(a);
- if (!test.correct) {
- cout << "Wrong answer! \nTest: " << a.a << " " << a.b << "\n";
- cout << "Participant: " << test.wrongAnswer << "\nJury: " << test.rightAnswer << "\n\n";
- } else {
- cout << "Accepted! \nTest: " << a.a << " " << a.b << "\n\n";
- }
- }
- }
- /*
- Что писать на олимпиаде?
- 1) У вас скорее всего написано решение на частичный балл
- 2) Вы уже написали решение, которое получило WA.
- 3) Значит осталось немного. Генератор тестов
- 4) Функция check на 3-4 строки
- 5) Функция main()
- Пишется это минут 5-10
- Что не получится отдебагать стрессами?
- 1) Вердикты TL, ML
- 2) Маловероятно получится отдебагать RE, если постараться, то можно(имеется ввиду, выход за предел индекса), можно попробовать найти именно тест.
- 3) Может быть такое, что у вас переполнение, его тоже не отдебажишь
- Основная задача - это фикс WA на маленьких тестах, то есть поиск какого-то минимального теста с помощью генерации.
- ДЗ: использовать это при решении домашних контестов
- */
- ------------------------------------------------------------------------------------------------------
- /*
- Задача про монетки
- Есть какая-то сумма W, а также есть n монеток и необходимо минимальным количеством монеток разменять сумму W.
- Монетки могут повторятся.
- Входные данные
- 1 строка два числа n и w
- 2 строка n чисел - монетки
- */
- std::mt19937 ran(time(0));
- int irand(int a, int b) {
- return a + ran() % (b - a + 1);
- }
- struct Test {
- int n, w;
- vector<int> coins;
- };
- struct Answer {
- bool correct = true;
- int wrongAnswer, rightAnswer;
- };
- Test gen() {
- Test ready;
- ready.n = irand(1, 5);
- ready.w = irand(5, 20);
- ready.coins.resize(ready.n);
- for (int i = 0; i < ready.n; ++i) {
- ready.coins[i] = irand(1, 6);
- }
- return ready;
- }
- int wrong_answer(Test a) {
- sort(a.coins.begin(), a.coins.end());
- int ans = 0;
- for (int i = a.coins.size() - 1; i >= 0; i--) {
- while (a.w >= a.coins[i]) {
- ans++;
- a.w -= a.coins[i];
- }
- }
- if (a.w > 0) {
- return -1;
- }
- return ans;
- }
- int correct_answer(Test &a) {
- int INF = 1e9;
- vector<int> summ(a.w + 1, INF);
- summ[0] = 0;
- for (int i = 1; i < a.w + 1; ++i) {
- for (auto j : a.coins) {
- if (i - j >= 0 && summ[i - j] + 1 < summ[i]) {
- summ[i] = summ[i - j] + 1;
- }
- }
- }
- if (summ[a.w] == INF) {
- return -1;
- }
- return summ[a.w];
- }
- ostream& operator<<(ostream& out, Test &t) {
- out << t.n << " " << t.w << "\n";
- for (int i : t.coins) {
- out << i << " ";
- }
- out << "\n";
- return out;
- }
- Answer check(Test &a) {
- int correctAnswer = correct_answer(a);
- int wrongAnswer = wrong_answer(a);
- return {correctAnswer == wrongAnswer, wrongAnswer, correctAnswer};
- }
- int main() {
- int countTest;
- cin >> countTest;
- while (countTest--) {
- Test a = gen();
- auto test = check(a);
- if (!test.correct) {
- cout << "Wrong answer! \nTest: \n" << a;
- cout << "Participant: " << test.wrongAnswer << "\nJury: " << test.rightAnswer << "\n\n";
- } else {
- cout << "Accepted!" << "\nTest:\n" << a << "\n";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement