1. Технология за състезателно програмиране и оценка на алгоритми
План:
Студентски състезания по програмиране
Стандарти на С++, компилатори, вход и изход
Вход и изход за много тестови примери
Пренасочване на входа и изхода от операционната система
Проверка на програмата в Хакерранк и от прeподавателя
Оценка на алгоритми (преговор)
Студентски състезания по програмиране
Стандарти на С++, компилатори
Dev-C++, Code::Blocks
за Windows, gcc за Linux, BSD и др. UNIX-ови ОС
Конзолни приложения, вход и изход
Стандартен вход и изход в С++
cin
>> <име на променлива>;
int k;
cin >> k;
cout
<< <име на променлива>;
int ik = -10;
unsigned int uk = 10;
long lk = -1000000;
unsigned long ulk = 1000000; // 16 битов цял тип данни
double dk = 2.52;
cout << ik << " " <<uk << " " << lk << " "
<< ulk<< " " << dk << "\n";
Вход и изход за много тестови примери
- Четене на зададен брой числа или думи (низове без интервали)
int n;
cin >> n;
for (int i = 0; i < n; i++) { cin >> ... }
- Четене до края на файла за числа или думи
while (cin >> x) { ...}
- Четене до края на файла на редове (редица от числа; низ,
съдържащ интервали)
string st;
while(getline(cin, st)) { ... }
- Четене всички числа от един ред, прочетен като низ
string st;
getline(cin, st);
int a[100], n = 0;
istringstream is(s);
while(is >> a[n]) n++;
Примери за различни
входове.
Пренасочване на входа и изхода от операционната система
Изпълним файл (executable) с програма на C++ със стандартни вход
(cin) и изход (cout):
- prog.exe (Windows)
- a.out (MacOS)
Текстов файл с входните данни за програмата: test1.inp
Изпълнение (стартиране) на програмата:
>prog < test1.inp > test1.sol (Windows)
$./a.out < test1.inp > test1.sol (MacOS)
Текстов файл,
произведен от програмата при това изпълнение: test1.sol
Проверка на програма в Хакерранк и от прeподавателя
Решенията се проверяват с много примери, неизвестни за
студента, включително гранични случаи.
В Хакерранк:
https://www.hackerrank.com/cscb325-2022 (Задачи)
Съобщения от изпълнение на програмата:
https://www.hackerrank.com/faq/after-submit
We run your code against hidden test cases.
Depending on the output your code produced, you can get the
following verdicts:
Accepted. Congratulations, your code passed all the test
cases! It's time to solve a new challenge!
Wrong Answer. The output your code produced didn't match
the output expected by the test case. Rethink your approach and
think about whether you misunderstood the problem or missed a
corner case.
Terminated due to timeout. Your code doesn't solve the
problem efficiently enough! If you write a O(2n) solution when n
= 100, it will surely time out and you're going to need to
optimize your algorithm. The time limits are different for each
language (some languages are slower than others), and you can
see the limits for all the languages we support at our
Environment page.
Runtime error/Segmentation Fault. Your code terminated
unexpectedly. Did you overrun your array? Is your code trying to
divide by zero?
Abort Called. Are you using too many resources? Maybe an
array you created is too large and exceeds the memory limit, or
an assert statement in your code is failing.
After you submit your code, hover your mouse cursor over the
icon for each test case to view the verdicts and runtime for
each test case your code was tested against.
Съобщения за грешки в други тестващи системи:
- грешка при изпълнение (Run-Time еrror - RT);
- надвишаване на определения лимит от време за тестване (Time
Limit еxceeded - TL);
- грешен резултат (Wrong Answer - WA);
- неправилен формат на изхода (Presentation Error - PE).
Проверка от преподавателя:
Проверка на програма f12345_1.cpp:
с входни данни (много тестове примери) във файла 1.inp.
Пример за MacOS:
mini:CSCB325 nkirov$ ./ad.sh 1 12345
Скриптове за проверка (файл ad.sh):
g++ f$2_$1.cpp
./a.out < $1.inp
rm a.out
clang++ -std=c++11 -stdlib=libc++ f$2_$1.cpp
time ./a.out < $1.inp
./a.out < $1.inp > $1s.sol
rm a.out
diff $1s.sol $1.sol
Тестване
на програмата
- стандартни тестови примери;
- гранични и специалн тестови примери;
- тестови примери с минимални и максимални размерности на входа;
- НЕ се разглеждат примери, които са извън зададените
ограничения;
- НЕ се прави проверка за коректност на входа.
Практически съвети:
- оценка на границите на данните (четене на тестовите примери)
- необходими ли са масиви?
- размерности на масивите;
- избор на тип данни (int, unsigned, long, long long, double, long
double);
- загуба на точност (артметични функции - sqrt);
- избор на алгоритъм - оценка с O-голямо. Дали е
най-бързият?
- предварителни пресмятания (преди или след прочитане на входа, на
част от входа);
- избор на примери за тестване на програмата;
- прецизиране на кода.
Оценка на алгоритми (преговор)
O(f) определя множеството от
всички функции g, които нарастват не
по-бързо от f, т.е. съществува константа c > 0
такава, че g (n) <= cf(n), за
всички достатъчно големи стойности на n.