Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 9

Задача "День рождения Короля"

07.09.2015, 01:16. Показов 997. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, возникла проблема "Time Limit" на 88м тесте проверки этой программы. Подскажите, пожалуйста, как можно оптимизировать решение? Ниже представлено условие и мой код.

Кликните здесь для просмотра всего текста

Ограничение по времени: 2 секунды
Ограничение по памяти: 256 мебибайт

Король Артур издал королевский приказ о выдаче подарков парам, которые сыграют
свадьбу в день его рождения. Он выбрал n подарков и приказал своему дворецкому
распределить подарки среди этих пар.
Дворецкий приехал во дворец бракосочетания и начал распределять подарки. В каждой
паре он дал ki подарков жениху и li подарков невесте, причем известно, что ki никогда не
было меньше li
, потому что дворецкий ненавидел женщин.
Люди узнали про этот приказ и очередь в дворец бракосочетания выглядела бесконечной.
После каждой пары дворецкий думал: “Как много пар! А осталось совсем немного
подарков. . . ”, — и всегда давал следующему жениху подарков не больше, чем невесте
предыдущей пары, так что выполнялось условие li > ki+1.
Подарки закончились, а очередь выглядела такой же длинонй. Дворецкий вышел из
дворца и повесился, так как не смог выполнить желание своего Короля. Такая грустная
история!
Известно что каждая невеста получила подарок, и что все подарки были распределены.
Найдите количество способов, которыми дворецкий мог распределить подарки Короля.
Порядок, в котором подарки были распределены, не важен.
Формат входных данных
Во входном файле записано одно число — количество подарков, которые Король Артур
решил распределить. Гарантируется, что n всегда меньше 100.
Формат выходных данных
В выходной файл выведите искомое количество способов.
Пример:
3 1
4 3
6 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
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication5
{
    class Program
    {
        private static int razb(int[] razA, int current)
        {
            int i = current - 1;
            int sum = 0;
            do
            {
                sum += razA[i--];
            }
            while (i > 0 && razA[i - 1] <= razA[i]);
            razA[i]++;
            current = i + sum;
            for (int j = i + 1; j < current; j++)
            {
                razA[j] = 1;
            }
            return current;
        }
 
        static void Main()
        {
            int n = int.Parse(Console.ReadLine());
            int[] razA = new int[n];
            int current = n;
            int result = 0;
            if (n % 2 == 0)
            {
                result = 1;
            }
            for (int i = 0; i < n; i++)
            {
                razA[i] = 1;
            }
            if (n != 1)
            {
                do
                {
                    current = razb(razA, current);
                    if(current % 2 == 0)
                    {
                        for (int i = 0; i < current; i++)
                        {
                            Console.Write(razA[i] + " ");
                        }
                        Console.WriteLine();
                        result++;
                    }
                }
                while (current > 1);
            }
            Console.WriteLine(result);
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.09.2015, 01:16
Ответы с готовыми решениями:

Заданы день и месяц рождения, а также текущие день, месяц и год. Определить, сколько дней осталось до дня рождения
заданы день и месяц рождения, а также текущие день, месяц и год. Определить, сколько дней осталось до дня рождения

Найти все годы в течение столетия, когда день недели рождения совпадает с днем недели очередного дня рождения
Дана дата дня рождения в формате день:месяц:год. Найти все годы в течение столетия, когда день недели рождения совпадает с днем недели...

Вывести ближайший день рождения
Доброго времени, есть задание, нужно вывести на консоль ближайшие 2-3 дня рождения в скором будущем. Или вывести на консоль все дни...

11
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
07.09.2015, 01:43
Ну вывод закомментить,кроме результата, это во первых, собирать проект в Release - во вторых.
А вообще, думай в сторону многопоточности.

Добавлено через 1 минуту
Тебе нужно сохранять последовательности или просто количество получить?
0
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 9
07.09.2015, 01:46  [ТС]
Просто получить ответ.
Вывод последовательностей сделал тут для проверки. На тесте выводилось только количество, что, конечно же, в сотни раз быстрее.

(Не знаю, как отредактировать тему, чтобы закомментить этот вывод вариантов)
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
07.09.2015, 01:50
Цитата Сообщение от Nemfi Посмотреть сообщение
Просто получить ответ.
Может есть какая то формула? Как из комбинаторики? Или можно воспользоваться численными методами?
Если нет - тогда потоки, рекурсивные алгоритмы возможно.
0
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 9
07.09.2015, 02:20  [ТС]
Рекурсией переполнение стека получилось, а потоками, к сожалению, пользоваться не умею.
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
07.09.2015, 02:21
http://oeis.org/search?q=0+1+1... &go=Search

Добавлено через 24 секунды
вот твоя последовательность
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
07.09.2015, 02:22
Просто я первые 20 повбивать решил Короче ее распознали и теперь ее нужно реализовать грамотно.
Миниатюры
Задача "День рождения Короля"  
0
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 9
07.09.2015, 02:29  [ТС]
Я тоже, кстати, выписывал первые 20 и пытался найти сайт, который поможет с последовательностью, но не нашёл
Спасибо!
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
07.09.2015, 02:34
Цитата Сообщение от Nemfi Посмотреть сообщение
Спасибо!
Да не за что, там на странице PROG есть, FORMULA есть - но, мало что понятно.
Отпишись как по формуле запилишь
0
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 9
07.09.2015, 03:24  [ТС]
Хмм, что-то там слишком сложно, даже не знаю, как этим воспользоваться.

Добавлено через 34 минуты
Может, тут можно как-нибудь избежать переполнения стека, появляющееся после входных данных "32?
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication5
{
    class Program
    {
        private static int razb(int[] razA, int current, ref int x)
        {
            int i = current - 1;
            int sum = 0;
            do
            {
                sum += razA[i--];
            }
            while (i > 0 && razA[i - 1] <= razA[i]);
            razA[i]++;
            current = i + sum;
            for (int j = i + 1; j < current; j++)
            {
                razA[j] = 1;
            }
            if (current % 2 == 0)
            {
                x++;
            }
            if (current > 1)
            {
                current = razb(razA, current, ref x);
            }
            return x;
        }
 
        static void Main()
        {
            int n = int.Parse(Console.ReadLine());
            int[] razA = new int[n];
            int current = n;
            int result = 0;
            if (n % 2 == 0)
            {
                result = 1;
            }
            for (int i = 0; i < n; i++)
            {
                razA[i] = 1;
            }
            if (n != 1)
            {
                current = razb(razA, current, ref result);
            }
            Console.WriteLine(result);
        }
    }
}
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
07.09.2015, 13:05
На всякий случай - на OEIS приведена таблица для n = {0-1000}.
http://oeis.org/A027187/b027187.txt

а(22) - твоя программа выдает 505.
А в таблице а(22) = 392, а(23) = 505.

Либо у тебя ошибка, либо в таблице.
Вообщем смещение результата на 1 шаг.
0
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 9
07.09.2015, 13:09  [ТС]
Это видел.
Тут нигде нет ошибок, т.к разница в 1 и 2 элементах, то есть просто смещение: мой a[i] = a(i+1) из таблицы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.09.2015, 13:09
Помогаю со студенческими работами здесь

Как сделать, чтобы проверяло день рождения?
Привет всем! Не понимаю, как сделать, чтобы проверяло, что день рождения состоит из цифр:( Если можно как-то ограничить значения, то...

Вывести список сотрудников, день рождения которых в мае
Задан список сотрудников: фамилия, группа, дата рождения . Вывести список сотрудников, день рождения которых в мае.

Напечатать имя и фамилию ученика,у которого сегодня день рождения
Напечатать имя и фамилию ученика,у которого сегодня день рождения private void Form1_Load(object sender, EventArgs e) { ...

Напечатать имя и фамилию ученика,у которого сегодня день рождения
Известны данные о 10 учениках класса: фамилии, имена, отчество, дата рождения (год, номер месяца и число). Определить, есть ли в классе...

Приложение, которое узнает ваш день рождения, хотя вы его не называете
Добавляем форму «Zadanie4». Приложение, которое узнает ваш день рождения, хотя вы его не называете. Выведите на форме label, в котором...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru