Я пишу программу для соревнований, и я, вероятно, слишком углубился, но уже слишком поздно, чтобы это изменить. Я также заканчиваю с этим и в процессе отладки. Я наконец не получаю ошибку и получаю результаты, которые я хочу. Но только примерно в 50% случаев.
Чтобы понять, что не так, я погрузился в GDB и, к своему огромному удивлению, всегда получал правильный результат. Я пытался сделать:
for i in {1..10000}
do
./program < test >> _
done
cat test | grep 4 | wc -l
cat test | grep 0 | wc -l
Я получил ок. Результаты 50/50. Я также попытался сделать это внутри своего кода, думая, что, возможно, это что-то делает в GDB, а отдельные действия занимают «больше времени», и поэтому я добавил:
for(int i = 0; i < 10000000; i++)
printf("%d\n",ans);
Но я всегда получал 100% одинаковые результаты от одного и того же экземпляра программы. Либо все они были не правы, либо все они были правы. Я перепробовал несколько тестов, и ответы всегда были либо правильными, либо 0.
Чтобы не делать этот пост огромным, вот мой код: https://pastebin.com/k6BwQ4X1 Он создает древовидную структуру Trie и выполняет многократные итерации по ним в основном while
. val
каждого узла Trie - это то, насколько большим должно быть соответствующее значение в attribs
, чтобы пройти через него. Например, если у меня есть дерево Trie, подобное этому:
1--2--0
/
root
\
9--0--1
Чтобы спуститься в нижнюю ветвь, вы должны иметь каждый атрибут по крайней мере в 9, 0, 1. Наименьшие значения для спуска в верхнюю ветвь будут attribs = {1, 2, 0}
Если вам нужна дополнительная информация о том, как работает программа, я с удовольствием отвечу, но объяснение всей программы займет слишком много времени, поэтому я надеюсь, что предоставленного мной достаточно. Заранее спасибо.
edit: я все еще в процессе минификации, но оказывается, что когда ответ неправильный (0), это потому, что он не достигает ans = etc
. В GDB, когда я отлаживаю, этого никогда не происходит. Любая идея, почему это произойдет только из этой информации. Немного сокращенный код: https://pastebin.com/8HBpTKDR Вы можете игнорировать часть до while (testIndex > 0)
. Это захват ввода, и это определенно правильно. Также удаление withoutProg, totalProg
может быть удалено полностью. Тогда все результаты неверны, но поведение 50% / 50% 0 не исчезает. Вы можете попробовать ввести:
2 2
1 0
1 1
0 0
1 0
0 1
ожидается: 2
результат: 50% время 2, 50% время 0.