С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 04.04.2019
Сообщений: 1

Доказательство теоремы

30.12.2021, 13:20. Показов 1200. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уже долгое время не могу решить эту задачу из сайта ACMP. Вот описание:
887. Доказательство теоремы
(Время: 1 сек. Память: 16 Мб Сложность: 47%)

Преподаватель читает курс лекций, в рамках которого обычно доказывается N различных теорем. Некоторые теоремы могут ссылаться в доказательстве друг на друга. Более точно, каждая теорема Ti зависит от некоторого набора из Ci других теорем; доказать ее можно лишь доказав не менее половины теорем из данного набора. При этом структура курса такова, что нет такой теоремы, от которой зависели бы две или более различных теоремы, а также нет цепочки теорем (Ti1,Ti2, . . . , Tis) такой, что Ti1 зависит от Ti2, Ti2 зависит от Ti3, …, Tis−1 зависит от Tis, а Tis – от Ti1.

Однако, в этом семестре в связи с обилием праздников, перекрывающихся с лекциями, может не удаться доказать все теоремы курса. Тем не менее, нужно доказать основную теорему курса – это центральный результат всей теории, и именно его, скорее всего, придется применять слушателям в других курсах в следующем семестре. Поэтому преподаватель хочет расположить теоремы в таком порядке, чтобы основную теорему курса удалось доказать как можно раньше. Затем, если останется время, он сможет вернуться к доказательству других, менее важных теорем.

Для простоты будем считать, что все теоремы доказываются за одинаковое время. Нужно доказать такое множество теорем и в таком порядке, чтобы основная теорема оказалась доказанной и чтобы общее время доказательства было минимально.
Входные данные

В первой строке входного файла INPUT.TXT записано число N (1 ≤ N ≤ 10 000) – количество теорем. Каждая из следующих N строк описывает теоремы, от которых зависит Ti−1, где i – номер этой строки во входном файле. Эти строки имеют вид Ai,1 Ai,2 ... Ai,Ci 0; здесь Ai,j – номер теоремы, от которой зависит Ti−1. Среди всех чисел Ai,j во входном файле нет двух одинаковых. Основная теорема имеет номер 1. Все числа во входном файле целые.
Выходные данные

В первой строке выходного файла OUTPUT.TXT выведите K – минимальное количество теорем, которые потребуется доказать. В последующих K строках выведите номера этих теорем в порядке их доказательства, по одному числу в каждой. Если ответов с минимальным K несколько, можно вывести любой из них.

Вот мой код. Он проходит 9 тестов, на 10 - wrong answer.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <stdio.h>
#include <algorithm>
#include <vector>
       
std::vector<bool> proved;
std::vector<int> order;
       
struct Theorem {
    int theorem;
    long long int count;
};
       
std::vector<std::vector<Theorem>> t;
       
Theorem makeTheoremWithCount(int theorem, long long int count) {
    Theorem theoremWithCount;
    theoremWithCount.theorem = theorem;
    theoremWithCount.count = count;
    return theoremWithCount;
}
       
void dfs(int theoremsGroup, int theorem) {
    int currentTheorem = t[theoremsGroup][theorem].theorem;
    if (proved[currentTheorem]) {
        return;
    }
        
    proved[currentTheorem] = true;
         
    if (t[currentTheorem].empty()) {
        t[theoremsGroup][theorem].count = t[theoremsGroup][theorem].count + 1;
        return;
    }
       
    int sizeOfTheorems = (int)t[currentTheorem].size();
    for (int i = 0; i < sizeOfTheorems; i++) {
        dfs(currentTheorem, i);
    }
           
    for (int i = 0; i < sizeOfTheorems; i++) {
        t[theoremsGroup][theorem].count = t[theoremsGroup][theorem].count + t[currentTheorem][i].count;
    }
           
    return;
}
       
void dfsFindShortestWay(int y) {
    std::sort(t[y].begin(), t[y].end(), [](Theorem a, Theorem b) {
        return a.count < b.count;
    });
         
    int sizeOfTheorems = (int)t[y].size()/2;
    if ((int)t[y].size() % 2 != 0) {
        sizeOfTheorems++;
    }
 
    for (int i = 0; i < sizeOfTheorems; i++) {
        dfsFindShortestWay(t[y][i].theorem);    
    }
 
    order.push_back(y);
}
       
int main()
{
    int n;
    scanf("%d", &n);
    proved.resize(n+1);
    t.resize(n+1);
           
    for (int i = 1; i <= n; i++) {
        proved[i] = false;
        int k;
        scanf("%d", &k);
        while (k != 0) {
            t[i].push_back(makeTheoremWithCount(k, 1));
            scanf("%d", &k);
        }
    }
       
    for (int i = 0; i < (int)t[1].size(); i++) {
        dfs(1, i);
    }
       
    dfsFindShortestWay(1);
            
    printf("%d\n", (int)order.size());
    for (int i = 0; i < (int)order.size(); i++) {
        printf("%d\n", order[i]);
    }
        
    return 0;
}
Можете подсказать, где ошибка?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.12.2021, 13:20
Ответы с готовыми решениями:

Реализация Теоремы Штурма
Необходимо написать программу для нахождения количества действительных корней многочлена n-й степени (теорема Штурма) Добавлено через...

Проверка теоремы Гольдбаха
Дано четное число n&gt;2; проверить для этого числа гипотезу Гольдбаха. Эта гипотеза (по сегодняшний день не опровергнута и полностью не...

Код Китайской теоремы остатков
Доброго времени суток. Помогите, пожалуйста. В учебнике Б.Штайера &quot;Прикладная криптография&quot; описывается код Китайской теоремы остатков...

1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,989
Записей в блоге: 32
30.12.2021, 19:37
Цитата Сообщение от Alisher_0139 Посмотреть сообщение
if ((int)t[y].size() % 2 != 0) {
sizeOfTheorems++;
}
C++
1
sizeOfTheorems += t[y].size() % 2;
Но это так, бантики... В алгоритм не вчитывался, накостылил свой
Миниатюры
Доказательство теоремы  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.12.2021, 19:37
Помогаю со студенческими работами здесь

Реализация Китайской теоремы об остатках
Задача программы - найти X, исходя из трёх сравнений. Код я написал, но никак не пойму, почему X принимает отрицательное, да и...

Бинарный поиск с соблюдением теоремы Пифагора
Всем привет. На input подается число (s), которое является суммой чисел a, b, c, которые предстоит найти. Условие следующее: ...

Написать программу из теории чисел для теоремы Эйлера
Привет. Решил делать программу для дискретной математики, а не знаю как записать все функции. Помогите, а то мозг кипит) Добавлено...

Программа выводит числа a,b и c не более 25, для которых верно равенство теоремы пифагора т.е a2+b2=c2
Программа выводит числа a,b и c не более 25, для которых верно равенство теоремы пифагора т.е a2+b2=c2 Помогите пож никак не...

Составить программу доказательство, что произведение матриц А и В некоммутативно
составить программу доказательства, что произведение матриц А и В некоммутативно.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru