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

Какое минимальное количество спичек нужно для того, чтобы построить в пространстве N кубов со стороной в одну спичку - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти номера строк и столбцов всех Седловых точек матрицы http://www.cyberforum.ru/cpp-beginners/thread172897.html
Дана целочисленная прямоугольная матрица. Определить: 1.) сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент; 2.) номера строк и столбцов всех Седловых точек матрицы. void main() { const int m=4, n=5; int a; int l = 1; int i,j; for (i=0; i < m; i++)
C++ обычная программа int x=0,n=0; cin>>x; while(x!=0){ x=x/10; n++; } cout<<n<<endl; ну думаю тут уже всем ясно что делает прога,считает сколько цифр,если я ввожу 1000 выводит 4-правильно а если я ввожу 456456456465456 то 0,почему http://www.cyberforum.ru/cpp-beginners/thread172895.html
C++ Задано множество пар вершин, построить матрицу инцидентности
матрица инцидентности задано множество пар вершин, построить матрицу инцидентности как вывести матрицу инцидентности?? cout<<"\nvvedite kilkist vershin: "; cin>>n; int kr; //введення cout<<"\n"<<"vvedite pochergovo rebra (po zavershenu vvedite '0'):"<<"\n";
a^3+b^3+c^3=d^3 C++
Здравствуйте! Задали задачу: написать программу, находящую целые a,b,c,d в промежутке от 1 до 10000, такие, что a^3+b^3+c^3=d^3 Надо, чтобы программа работала быстро (до 1мин). Простые вложенные циклы будут работать очень долго. В интернете нашёл некую реализацию на c++, но во-первых в c++ я слаб (не до конца понимаю смысл переменных M и N), во-вторых прога всё равно работает долго. Вот код:...
C++ Экранная клавиатура http://www.cyberforum.ru/cpp-beginners/thread172876.html
Надо сделать так, чтобы нажимая мышкой кнопки на форме(например "4") программа записывала их в запущеный текстовый редактор(блокнот). В интернете ничего вразумительного пока не нашол( Кто знает - подскажите пожалуста.
C++ Из двух заданных строк определить ту, которая содержит максимальную долю пробелов в ней Всем здравствуйте! прошу помощи в лаборатоной работе: Даны две строки. Определить номер строки (первая или вторая), которая содержит максимальную долю пробелов в ней. Для строк с равными долями пробелов должно быть выведено соответствующее сообщение. Зарание спасибо. И не могли бы посоветовать какие-нить самоучители по с++ ? подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,657
07.10.2010, 20:43     Какое минимальное количество спичек нужно для того, чтобы построить в пространстве N кубов со стороной в одну спичку
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
/////////////////////////////////////////////////////////////////////////////////////////
//  Какое минимальное количество спичек нужно для того, чтобы построить 
//  в пространстве N кубов со стороной в одну спичку? 
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <cmath>
////////////////////////////////////////////////////////////////////////////////////////
int matches_quantity_for_gran(int  n)
{
    /*
    Используем функцию для подсчета минимального количества спичек из предыдущей
    задачи, с подсчетом еще и вертикальных спичек.
 
    int matches_quantity_for_squares(int  n)
    {
        int s = static_cast<int>(floor(sqrt(static_cast<double>(n))));
        int k = n - s * s;
        int p = (k == 0) ? 0 : (k - 1)/s + 1;
        return 2*s*(s+1) + p*3 + (k-p)*2;
    }
 
    Тогда для квадрата со стороной s вместо количества спичек 2*s*(s+1) 
    будет 2*s*(s+1) + (s + 1)*(s + 1),
    p будет умножаться не на 3, а на 5, 
    а (k-p) не на 2, а на 3.
    */
    if(n == 0)
    {
        return 0;
    }
    int s = static_cast<int>(floor(sqrt(static_cast<double>(n))));
    int k = n - s * s;
    int p = (k == 0) ? 0 : (k - 1)/s + 1;
    //return 2*s*(s+1) + p*3 + (k-p)*2;
    return 2*s*(s+1) + (s + 1)*(s + 1) + p*5 + (k-p)*3;
}
////////////////////////////////////////////////////////////////////////////////////////
int matches_quantity_for_cubes(int  n)
{    
    //Очевидно, что наиболее компактная фигура из кубов получится, если мы будем 
    //строить фигуру следующим образом. 
    //Строим максимально возможный куб со стороной s, на который затрачивается
    //3*(s+1)^2*s спичек.
    int s = static_cast<int>(floor(pow(static_cast<double>(n), 1.0/3.0)));
    int res = 3 * (s + 1) * (s + 1) * s;
    int k = n - s*s*s;
    if(k == 0)
    {
        return res;
    }
 
    //К этому кубу нам надо достраивать три грани размерами:
    //1) s x s, 
    //2) s x (s + 1)
    //3) (s + 1) x (s + 1),
    //пока не получим нужное количество кубов.
        
    int gran_1_cubes_count = s * s;
    int gran_2_cubes_count = s * (s + 1);
 
    if(k >= gran_1_cubes_count)    
    {
        res += matches_quantity_for_gran(gran_1_cubes_count);
        k -= gran_1_cubes_count;
        if(k >= gran_2_cubes_count)
        
        {
            res += matches_quantity_for_gran(gran_2_cubes_count);
            k -= gran_2_cubes_count;                    
        }
    }
    return res + matches_quantity_for_gran(k);  
}
////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    for(;;)
    {
        int  cubes_count;
        do
        {
            std::cout << "число кубов > 0   = ";            
            std::cin >> cubes_count;        
        }while(cubes_count <= 0);
 
        std::cout <<     "количество спичек = "
                  << matches_quantity_for_cubes(cubes_count)
                  << std::endl
                  << std::endl
                  << std::endl;    
    }
}
 
Текущее время: 16:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru