Я получаю разные результаты из моей программы и также не могу воспроизвести один из них в GDB - PullRequest
0 голосов
/ 08 января 2019

Я пишу программу для соревнований, и я, вероятно, слишком углубился, но уже слишком поздно, чтобы это изменить. Я также заканчиваю с этим и в процессе отладки. Я наконец не получаю ошибку и получаю результаты, которые я хочу. Но только примерно в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...