Форум программистов, компьютерный форум CyberForum.ru

Дерево турнира с выбыванием - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сколько есть способов выплатить сумму http://www.cyberforum.ru/cpp-beginners/thread697600.html
В Эстонии в обращении находятся 1,2,5,10,25,50,100 и 500 - кроновые купюры. Написать программу, которая сможет найти сколько есть различных способов выплатить данную сумму. На единственной строке текстового файла raha.sis.txt дано целое число S(0 < S < 250). На единственной строке текстового файла raha.val.txt вывести количество различных способов выплаты. Пример: Файл raha.sis.txt...
C++ Конструктор копирования в c++ Добрый день, такая задача по с++ Какая ошибка в следующей реализации конструктора копирования по умолчанию и деструктора?? Какой еще оператор необходимо перегрузить для данного класса?? typedef unsigned int dlina; const dlina n=30; class Mouse { dlina rost; protected: http://www.cyberforum.ru/cpp-beginners/thread697586.html
C++ Не работает код
Дан файл zzz.txt В нем подсчитать кол-во букв «а»(латинская) с разбивкой по строчкам. В другом файле (qqq.txt) вывести результаты Всего вхождений: 3 (т.е. общее количествол букв а) Строка 1: 2(т.е. количество букв в этой строке) В данном коде не подсчитывает количество букв "а" как в строке так и в файле #include "stdafx.h" #include <iostream> #include <stdlib.h>
Необходимо перевести из паскаля в с++ C++
Имеется программа на Паскале: uses crt; var a: array of string; i,j,k,l: byte; s,sl: string; begin write('s='); readln(s); s:=s+' '; sl:=''; j:=0; for i:=1 to length(s) do if not (s in )
C++ Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. http://www.cyberforum.ru/cpp-beginners/thread697559.html
Дана задача. Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. Я написал нижеследующее, но программа выводит почему то такие числа как 12252240, 24504480 и т.д. Что я тут неправильно написал? /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////...
C++ Массив: Учащиеся участвовали в посадке деревьев. Сколько деревьев было посажено 1)Учащиеся 8-х классов участвовали в посадке деревьев. 8-а посадил 100 деревьев, 8-б —122 дерева, 8-в — 98 деревьев, 8-г — 104 дерева, 8-д — 121 дерево. Определить, сколько посажено деревьев. подробнее

Показать сообщение отдельно
gunslinger17
 Аватар для gunslinger17
0 / 0 / 0
Регистрация: 25.02.2012
Сообщений: 80
17.11.2012, 22:31  [ТС]     Дерево турнира с выбыванием
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
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
#include <iostream>
#include <list>
#include <ctime> 
using namespace std;
struct node{
    int value;
    int level;
    node* left;
    node* right;
    node(int val=0):value(val), right(NULL), left(NULL), level(0){};
};
list<node*> fill(){
    list<node*> buffer;
    int n;
    struct node* new_elem;
    srand(time(NULL));
    cout<<"input n of elems:";
    cin>>n;
    cout<<"elements are:";
    while(n--)
    {
        new_elem=new node(rand()%90+10);
        cout<<(new_elem->value)<<", ";
        buffer.push_back(new_elem);
    }
    cout<<endl;
    return buffer;
}
node* build_tree(list<node*> buffer){
    node* a;
    node* b;
    node* parent_of_a_b;
 
    while (!buffer.empty()){
        a=buffer.front();
        buffer.pop_front();
        if (buffer.empty())
            return a;
        b=buffer.front();
        buffer.pop_front();
        parent_of_a_b=new node(max(a->value, b->value));
        parent_of_a_b->left=a;
        parent_of_a_b->right=b;
        parent_of_a_b->level=max(a->level, b->level)+1;
        buffer.push_back(parent_of_a_b);    
    }
 
}
void print_level(int lvl, node* root){
    if (root->level>lvl){
        print_level(lvl, root->left);
        print_level(lvl, root->right);
    }
    else{
        if (root->level==lvl){
            cout<<root->value;
            for (int i=0; i<4*(1<<lvl)-2; i++)
                cout<<" ";
        }
    }
 
}
void print_tree(node* root){
    cout<<"THE TREE:"<<endl;
    for (int i=(root->level); i>=0; i--){
        for (int j=0; j<2*(1<<i)-2; j++)
            cout<<" ";
        print_level(i, root);
        cout<<endl;
    }
}
int main() // Оcновное тело программы
{
    list<node*> buffer;
    node* root;
    buffer=fill();
    root=build_tree(buffer);
    print_tree(root);
    system("PAUSE");
}
Правда рисуется кривовато, но ты там посмотри, сколько пробелов между числами в цикле ставить...
Спасибо) Правда нам используя стандартные библиотеки надо реализовать)
Но все равно спасибо, буду ковырять)

Добавлено через 1 минуту
В книге седжвика нашел алгоритм реализации турнирного дерева и переделал под свои цели, но... Что-то там больно большое дерево получается)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
tree *tournament(tree *current, int massive[],int l,int r)
{
    int m = (l+r)/2;
    current = new tree;
    current->info = massive[m];
    current->right = NULL;
    current->left = NULL;
    if (l == r) 
        return current;
    current->left = tournament (current->left,massive, 1, m) ;
    current->right = tournament (current->right,massive, m+1, r) ;
    int u = current->left->info;
    int v = current->right->info;
    if (u > v) 
        current->info = u; 
    else current->info=v;
    return current;
}
 
Текущее время: 17:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru