Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
31 / 27 / 20
Регистрация: 26.10.2017
Сообщений: 88
1

Задача экскурсия

30.11.2017, 11:03. Показов 3304. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Экскурсии под руководством Ивана Петровича проходят всегда очень организованно. Ивану Петровичу особенно нравятся построения в форме квадрата, так как если какой-то школьник отстанет от группы, его отсутствие в квадрате является более заметным, чем при использовании построения в форме шеренги и колонны по одному. Поэтому школьники разбиваются на несколько групп, для которых возможно построение в форме квадрата. Чтобы разные группы были хорошо различимы визуально, требуется, чтобы в разных группах было разное число школьников. Из 100 школьников можно сделать одну группу 10×10, или две группы 6×6 и 8×8, но лучше с точки зрения Ивана Петровича сделать 5 групп 1×1, 3×3, 4×4, 5×5 и 7×7.

Напишите программу, которая находит разбиение N школьников на группы в форме квадратов, среди которых нет двух одинаковых по количеству. Количество групп в разбиении должно быть как можно больше.

Входные данные

В первой строке ввода содержится одно целое число N (1  ≤ N  ≤  105) – число школьников, отправляющихся на экскурсию.

Выходные данные

Если разбиение найдено, то вывести в первой строке количество групп в разбиении, а во второй строке – в порядке возрастания размеры стороны квадратных групп. Если существует несколько разбиений с максимальным количеством групп, то вывести любое. Если разбиения не существует, в первой строке вывести 0.

Решите с объяснением, пожалуйста, или алгоритм дайте.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2017, 11:03
Ответы с готовыми решениями:

Поля структуры "Экскурсия"
Здравствуйте! Такая проблема Мне нужно составить что-то вроде таблиц экскурсий У меня 5 полей...

Автобусная экскурсия
Оргкомитет города P решил организовать обзорную экскурсию по городу для участников олимпиады. Для...

Виртуальная экскурсия
Привет, подскажите как такое можно реализовать http://kramatorsk.pp.ua/tur004_.html

Автобусная экскурсия
Автобусная экскурсия Оргкомитет Московской городской олимпиады решил организовать обзорную...

5
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
30.11.2017, 15:30 2
Лучший ответ Сообщение было отмечено Евгений754 как решение

Решение

проверь, отпишись
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
#include <iostream>
const int size = 106;
const int vers = 10;
struct {
    int versions;
    int bits[vers];
}result[size];
int main()
{
    int N;
    std::cin >> N;
    for (int i = 1; i <= N; ++i)
    {
        result[i].versions = 0;
        for (int j=1; j*2<=i; ++j)
        {
            for (int iver1 = 0; iver1 != result[j].versions; ++iver1)
                for (int iver2 = 0; iver2 != result[i - j].versions; ++iver2)
                {
                    if ((result[j].bits[iver1] & result[i - j].bits[iver2]) == 0)
                    {
                        bool unique = true;
                        for (int iver3 = 0; iver3 < result[i].versions && unique; ++iver3)
                        {
                            int& bits3 = result[i].bits[iver3];
                            int& bits2 = result[j].bits[iver1];
                            int& bits1 = result[i - j].bits[iver2];
                            unique = (bits3 != (bits2|bits1) );
                        }
                        if (unique)
                        {
                            result[i].bits[result[i].versions] = result[j].bits[iver1] | result[i - j].bits[iver2];
                            result[i].versions++;
                        }
                    }
                }
        }
        int sq = 1;
        while (sq*sq < i )
            ++sq;
        if (sq*sq==i)
        {
            result[i].bits[result[i].versions] = 1<<sq;
            ++result[i].versions;
        }
    }
    if (result[N].versions)
    {
        int version = result[N].bits[0];
        for (int i = 1; i < result[N].versions; ++i)
            if (result[N].bits[i] < version)
                version = result[N].bits[i];
        int i = 1, cnt = 0;
        while (i <= version)
        {
            if (i&version) ++cnt;
            i <<= 1;
        }
        std::cout << cnt << std::endl;
        i = 1;
        while ((1 << i) <= version)
        {
            if ((1 << i)&version)
                std::cout << i << " ";
            ++i;
        }
 
 
    }
    return 0;
}
Добавлено через 19 минут
очевидно, потому что там ты сортируешь пузырьком, а здесь выбором.
Учи матчасть!

Добавлено через 20 минут
"учи матчасть", - это в другую тему, не тебе
0
31 / 27 / 20
Регистрация: 26.10.2017
Сообщений: 88
30.11.2017, 17:05  [ТС] 3
Работает, спасибо. Код сделать нельзя?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
30.11.2017, 17:15 4
Цитата Сообщение от Евгений754 Посмотреть сообщение
Код сделать нельзя?
в смысле код?
0
31 / 27 / 20
Регистрация: 26.10.2017
Сообщений: 88
30.11.2017, 21:10  [ТС] 5
Неправильно написал. Я хотел сказать: "Можно решение более простым сделать?"
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
30.11.2017, 22:12 6
да, конечно.
Вот вариант попроще
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
#include <iostream>
int main() {
    int N;
    int bitset, value=0, cnt;
    std::cin >> N;
    for (bitset=0; value<N; ++bitset)
    {
        int bit = 0;
        value = 0;
        cnt = 0;
        while (bitset>=( 1 << bit))
        {
            if (bitset&(1 << bit))
            {
                ++cnt;
                value += (bit + 1)*(bit + 1);
            }
            ++bit;
        }
    }
    if (value == N)
    {
        int bit = 0;
        std::cout << cnt << std::endl;
        while (bitset >= (1 << bit))
        {
            if (bitset&(1 << bit))
                std::cout << bit+1 << " ";
            ++bit;
        }
    }
    else
        std::cout << 0;
 
    system("pause");
    return 0;
}
0
30.11.2017, 22:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2017, 22:12
Помогаю со студенческими работами здесь

Виртуальная экскурсия на флеш
Добрый день всем, возникла проблема, нужно сделать виртуальную экскурсию по школе на сайте, типа...

Виртуальная экскурсия по зданию
Здравствуйте. На дипломную работу нужно реализовать виртуальную экскурсию по колледжу, с...

Закончится ли экскурсия благополучно
Оргкомитет Московской городской олимпиады решил организовать обзорную экскурсию по Москве для...

Разработать иерархию классов Rest < Journey < Tour (Отдых < Поездка < Экскурсия)
Разработать иерархию классов Rest&lt;== Journey&lt;==Tour (Отдых&lt;==Поездка&lt;== Экскурсия) Правила в...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru