ibash.org.ru - Новый цитатник Рунета

Форум: Олимпиада по информатике — всякие забавные задачки и их решение. 1 > [RSS]

Форум: Вход Регистрация Участники Поиск RSS

Xenius
27.09.2011 - 14:10

Итак. Правила таковы:
1) Начинающий даёт задачу по информатике и своё к ней решение на каком-либо языке программирования
2) Следующий участник должен решить задачу одного из предыдущих участников на таком языке программирования. который ещё не использовался в треде. Разрешается любой язык программирования, для которого есть публично доступный компилятор/интерпретатор с открытыми исходными кодами и свободной лицензией, который можно запустить на GNU/Linux без применения несвободных компонентов.
3) Решивший хотя бы одну задачу имеет право задать свою задачу

При желании можно решать и уже решенные задачи, но если язык программирования уже был в треде, задача уже была решена похожим способом, или тем более тот же язык программирования был применен для той же задачи и решение было похожее — баллов начисляется меньше.

Итоги подводятся когда в треде будет хотя бы 10-20 решений.

Итак, первая задача:
Прямоугольник, стороны которого параллельны осям координат, будем задавать координатами его левого нижнего и правого верхнего углов. Заданы два прямоугольника, Пр1 и Пр2. (Всего, таким образом, для задания прямоугольника понадобятся 4 числа). Определите площадь той части Пр1, которая не входит в Пр2. (Алгоритм должен быть пригоден для любого расположения Пр1 и Пр2)
(Задача с всесоюзной олимпиады по информатике 1988)

Решение на bash:
http://paste.org.ru/?dg0mja
Решение на C (не моё, в олимпиаде не участвует):
http://pastebin.com/6CfwEjmd

В общем, решите эту задачу на любом языке, какого ещё не было и запостите свою.

Xenius
#1 - 27.09.2011 - 14:58

Прямоугольник, стороны которого параллельны осям координат, будем задавать координатами его левого нижнего и правого верхнего углов. (Всего, таким образом, для задания прямоугольника понадобятся 4 числа). Заданы два прямоугольника, Пр1 и Пр2. Определите площадь той части Пр1, которая не входит в Пр2. (Алгоритм должен быть пригоден для любого расположения Пр1 и Пр2)

Кажется, опечатка в условии. Впрочем, на смысл она не влияет

Кто-то
#2 - 27.09.2011 - 16:28

А C,C++,C# считать тремя разными языками?

Zenitur
#3 - 27.09.2011 - 16:36

На компе стоит винда, как поставить окно поверх всех окон?

gdulhr
#4 - 27.09.2011 - 16:58

#3 Поставить KDE для виндовс. Я как-то решился но забил на это ибо тогда по gprs это было нереально.
:)

fire
#5 - 27.09.2011 - 17:24

#3 http://img-fotki.yandex.ru/get/4102/pant-alexander.10/0_25c16_6b53bb2c_-1-L так? :D

Xenius
#6 - 28.09.2011 - 03:50

Разными, если решение активно использует уникальные фичи того языка. То есть если решение на C++ отличается от решения на C только например cout вместо printf, то не канает

Кто-то
#7 - 29.09.2011 - 08:53

>Всего, таким образом, для задания прямоугольника понадобятся 4 числа.

А числа целые или вещественные?

А если вещественные, то сколько знаков после запятой?

А могут эти числа быть отрицательными?

А могут быть прямоугольники вырожденными?

А можно указать нижнюю и верхнюю границу для этих чисел?

Xenius
#8 - 30.09.2011 - 09:43

Реши хоть как-нибудь. Эта задача алгоритмическая больше — то есть надо придумать алгоритм, а он вряд ли отличается для целых или нецелых чисел.

Кто-то
#9 - 30.09.2011 - 20:46

Прошу считать меня ленивым извращенцем (язык C#)

http://pastebin.com/t72nSTvC

Кто-то
#10 - 30.09.2011 - 20:50

Oops! а моё решение не удовлетворяет пункту 2.

Кто-то
#11 - 30.09.2011 - 21:12

Пофиксил версию под MonoDevelop http://pastebin.com/BVH0vCBx

Xenius
#12 - 01.10.2011 - 03:39

Пофиксил неправильный алгоритм подсчёта — учёл что один прямоугольник может быть внутри другого: http://paste.org.ru/?1izebz

#9 Решать оно наверное решает, но таки там алгоритма никакого нет, а только обёртка над библиотечным вызовом.

Xenius
#13 - 01.10.2011 - 03:43

Забавно, в Шиндовшс даже C# кривее чем в моно?

Кто-то
#14 - 01.10.2011 - 10:27

#13 да не сказал бы, просто в первом случае я взял Rect из пространства имён, которое я не нашёл в Mono, пришлось взять другое пространство имён и Rectangle вместо Rect.

#12 что значит нет алгоритма? Я пишу другом языке и на 100% использую его возможности. Вот скажем, если стоит задача сложить два числа в которых по 100 значащих чисел я возьму Java и классы BigInteger или BigDecimal и решу эту задачу в одну строчку и буду прав, потому что нет никакого профита хвататься за C++ и реализовывать длинную арифметику.

То же самое с НОД, можно реализовывать алгоритм Евклида, а можно взять библиотечную функцию Java.

Или вот дана такая задача.
Дано n от 1 до 100, необходимо посчитать сколько существует простых чисел <=n
Я могу написать вот такое ленивое решение http://pastebin.com/fnuf41uw и буду прав, т.к. моё решение будет самым быстрым (т.е. и напишу я его быстрее чем остальные, и работать оно будет быстрее чем у остальных)!

Я конечно понимаю, что нельзя брать функции из нестандартных библиотек, которые не поставляются со средой разработки.

VovanZ
#15 - 15.10.2011 - 17:28

http://pastebin.com/tLK83USN - Scheme
P. S. Юзайте acm.timus.ru =)

VovanZ
#16 - 15.10.2011 - 17:33

P. P. S. Тестил в DrRacket, но должно работать в любом интерпретаторе Scheme.
P. P. P. S. Scheme незначительно отличается от Lisp, чтобы работало в лиспе надо слегка изменить, но думаю можно считать, что Scheme и Lisp слишком блихки, так что не постите на лиспе, жду решения на хаскелле или прологе =))

VovanZ
#17 - 15.10.2011 - 17:48

Моя задача:
Петя записал на бумажке натуральное число n в системе исчисления k.
Вася нашёл эту бумажку и решил, что на ней записано число в системе исчисления l (k<=l), перевел его в десятичную систему и получил m.
Ваша задача восстановить n.
Программе на входе подается три числа k, l, m выведите n.
Пример:
k=2, l=3, m=10, на бумажке было записано "101", значит n=5.

VovanZ
#18 - 15.10.2011 - 17:50

P. S. Задачу придумал сам.

VovanZ
#19 - 15.10.2011 - 17:52

P. P. S. Если описанный случай невозможен выведите "WTF?".

VovanZ
#20 - 15.10.2011 - 18:13

P. P. P. S. В тексте задачи конечно же имеется ввиду система счисления, а не "система исчисления", досадная опечатка.

VovanZ
#21 - 15.10.2011 - 18:14

2admins: просьба объединить мои последние посты в один

Кто-то
#22 - 15.10.2011 - 22:56

#17

Пока никто не использовал мой любимый язык...
http://pastebin.com/uCxCEQ2N

Случай больших чисел не рассматривал

P.S. Юзайте www.codeforces.ru

VovanZ
#23 - 16.10.2011 - 16:10

#17
Моё собственное слегка быдлокодерское решение на яваскрипте http://jsfiddle.net/c8Zaw/
Кстати, jsfiddle удобная штука, позволяет писать прямо в браузере и сразу тестить любой код на html, css и javascript

#22
+1, алгоритм вроде правильный и все сходу придуманные тесты проходит. Ждём вашей задачи =)

Кто-то
#24 - 16.10.2011 - 18:54

Ну вот такая задачка, которая имеет весьма хитрое решение :)

Все знают, что билет называется счастливым если сумма цифр левой части номера билета равняется сумме цифр правой части номера билета. Девочка Олечка очень часто пользуется трамваем и каждый раз проверяет свой билет на свойство «счастливости», а что бы повысить свои шансы она проверяет номер билета на счастливость не только в десятичной системе исчисления, но и в системах исчисления с другим основанием, естественно не доходя до случая, когда номер билета вырождается в одну единственную цифру. Поскольку перевод чисел в другую систему исчисления является явно непосильной задачей для девочки Олечки, помогите ей и составьте программу, которая будет определять, является ли номер билета счастливым.

Входные данные
Каждый тестовый набор содержит номер билета A.
100 000 <= A <= 999 999

Выходные данные
Для каждого тестового набора необходимо вывести YES если номер билета является счастливым хотя бы в одной системе исчисления и NO если он таковым не является.

Пример входных данных
699050
222222

Пример выходных данных
YES
YES

VovanZ
#25 - 16.10.2011 - 19:07

Хмм, интересно...
Во первых, что делать если число получается из нечетного числа символов? Например xyz. Считать, что xyz = 0xyz ?
Навскидку - решение брутфорсом, т. е. перебором систем счисления от 2х до A-1 пишется относительно несложно, но работает охрененно долго. На каком-нибудь соревновании оно бы не зашло по тайм лимиту. Возможно существует более оптимальное решение....

VovanZ
#26 - 16.10.2011 - 19:10

Кажется я понял фишку =)
Буду дома, напишу. Просьба не занимать C++ :)

Кто-то
#27 - 16.10.2011 - 19:30

Входные данные подразумевают гарантировано 6 цифр в числе.

VovanZ
#28 - 16.10.2011 - 20:26

#27 - после перевода числа в другую систему может появиться нечётное число разрядов.
Пример: 100000(10-чная система, 6 разрядов) = 2050544 (6-чная система, 7 разрядов)

VovanZ
#29 - 16.10.2011 - 20:46

http://pastebin.com/LStTaL1k - моё решение на C++
Не запускал, возможны синтаксические ошибки. Не уверен в правильности, но контр-пример придумать не могу. Просьба отписаться о том правильно ли я понял условие и правильно ли моё решение.
Те кто не решал задачу - не открывайте, вам будет неинтересно)

Кто-то
#30 - 16.10.2011 - 21:03

Да, всё правильно, это самое эффективное решение :)

VovanZ
#31 - 16.10.2011 - 21:33

Красивая задачка, мне понравилось =))

VovanZ
#32 - 16.10.2011 - 22:00

Не уверен, что правильно понял пункт 3 правил, которые предложил топикстартер "Решивший хотя бы одну задачу имеет право задать свою задачу".
Думаю, что решив вторую задачу я могу предложить ещё одну свою.
Я решил, что брать задачи из архивов типа Тимуса не очень интересно, но ничего своего интересного придумать не могу.
Пусть будет задача без особой фишечки, но технически сложная, так что за***шься писать.



Дано n (n<100) выпуклых многоугольников на плоскости заданных координатами точек. Координаты всех точек целые и не превосходят по модулю 100000.
Найдите площадь их пересечения.


Формат ввода:
В первой строке записано единственное число n - количество многоугольников.
В следующей строке число m_1 - количество вершин первого многоугольника, в каждой из следующих m_1 (m_1 > 2) строк записана пара целых чисел - координаты вершины многоугольника. Вершины даны в порядке обхода в произвольном направлении. Далее следует второй многоугольник заданный в таком же формате и т. д.

Формат вывода:
Единственное вещественное число с точностью не менее 10^5.


Пример ввода:
2
4
0 0
1 0
1 2
0 2
4
0 0
2 0
2 1
0 1

Пример вывода:
1

VovanZ
#33 - 16.10.2011 - 22:02

P. S. Задача является в некоторой степени троллингом, ибо я осознаю, что задача решаема, даже примерно представляю как её решать, но мне самому понадобится очень много времени для её написания =)
К списку вопросовСтраницы: 1 >

Быстрый ответ
Имя:      Пароль:    
Текст сообщения:

«ibash.org.ru — Новый цитатник Рунета» Почта вебмастера: imail@ibash.org.ru