ingenero: (Default)
Наткнулся на обсуждение в форуме. Речь о том, что американец приводит задачу для наших 6-7 класса, и спрашивает, могут ли американские сверстники ее решить.

Суть в том, что: На рассвете, две машины выехали из городов А и Б навстречу друг другу. В полночь они встретились, и покатили дальше. Автомобиль из города А приехал в 4 PM, второй автомобиль - в 9 PM. Расстояние между городами 500 миль. Вопрос - когда же у них рассвет?

Я тряхнул стариной, и кое-как вспомнил, как решать такие задачи. Свое решение привел на том же форумы. Но что странно, американцы так и не предложили правильное решение. Есть пара ошибочных вариантов, но они даже не проверили их. Я крайне далек от мысли, что "ну тупые...", но с математикой похоже и правда проблема. Отсюда интересно, а много ли русских, смогут решить эту задачу?

Вообще же, впечатления от чтения американского форума весьма неплохие, народ там хороший, и я с ними согласен гораздо чаще, чем с соотечественниками. Но это как-нибудь в другой раз.

Date: 2011-09-28 03:42 am (UTC)From: [identity profile] ingenero.livejournal.com
Я пришел к тем же выводам :-) А американцы - нет.

Date: 2011-09-28 03:54 am (UTC)From: [identity profile] rudolf-khb.livejournal.com
Ну вообще составление уравнений в этой задаче действительно на уровне 7-го класса, но задачка явно из разряда повышенной сложности. А моему племяннику в 8-м классе на олимпиаде по математике досталась такая задачка:
"Встречаются два приятеля - математика:
- Ну как дела, как живешь?
- Все хорошо, два сына - ещё не доросли до школьного возраста.
- Сколько им лет?
- Произведение их возрастов равно количеству голубей возле этой скамейки.
- Этой информации мне недостаточно.
- Старший похож на мать.
- Теперь я знаю ответ на твой вопрос.
Сколько лет сыновьям?"

Честно сказать - сам я не догадался как ее решить - посмотрел в интернете, оказалось все совсем несложно.

Date: 2011-09-28 06:18 am (UTC)From: [identity profile] ingenero.livejournal.com
Вообще говоря, при таких данных решения действительно нет.

Если считать дошкольника от 0 до 6 лет, то кол-во голубей 0-36. Т.к. среди них есть старший и младший, значит разница минимум в 1 год (вообще это не совсем так, у близнецов тоже считается есть старший и младший), то получаем 0-30 голубей.

Значит надо привязываться к другим подсказкам. Похожесть на маму - ложный след, т.к. это видно с 0 лет. Можно ограничиться возрастом дошкольника 4-6 лет, но это надо было объявлять в условиях задачи. Или кол-во объектов, которые можно охватить одним взглядом. 30 голубей не так просто пересчитать. Но это антиматематический подход, мне это не нравится, это могли быть 2 чокнутых математика, которые считают все на своем пути, в т.ч. и стаи голубей.

Нужно привязаться к тому, что далеко не все числа 0-30 можно получить перемножением целых чисел. Т.е. 29 - нельзя. Но в любом случае, надо предварительно ограничить возраст дошкольников.

Похоже, надо брать минимальное число, которое можно получить произведением чисел 4-6, но это решение от фонаря. Подумаю еще.

Date: 2011-09-28 06:35 am (UTC)From: [identity profile] rudolf-khb.livejournal.com
Подумай - решение чисто математическое. В задаче есть вся информация что нужна.

Date: 2011-09-28 07:13 am (UTC)From: [identity profile] ingenero.livejournal.com
Понял подсказку. Задача имеет решение, т.е. существует только единственное кол-во голубей, дающее однозначное решение задачи. Осталось это оформить математически.

Date: 2011-09-28 08:11 am (UTC)From: [identity profile] ingenero.livejournal.com
Ура, понял! Главное - в первоначальном комментарии, что "информации недостаточно", и понадобилось уточнить, что дети разновозрастные. Т.е. кол-во голубей - квадрат числа. Это 1-4-9-16-25-36. Но это число должно получаться произведением разных чисел, остается только 4. Возраст 1 и 4 года. Как это оформить в виде уравнений - не знаю.

Date: 2011-09-28 09:05 am (UTC)From: [identity profile] rudolf-khb.livejournal.com
Да, все верно. но никакими уравнениями тут решать не надо, просто перебор и логика.

Date: 2011-09-28 09:24 am (UTC)From: [identity profile] jtraub.livejournal.com
Вот недавно задали задачку очень похожую и попросили решить на любимом языке программирования.

Вот она:
http://users.livejournal.com/_darkus_/592464.html

Честно говоря, голову пришлось поломать и программа вышла не такой уж короткой и тривиальной.

Date: 2011-09-28 10:07 pm (UTC)From: [identity profile] ingenero.livejournal.com
Задача получилась интересной. Долго думал про троллейбус, ошибочно решил, что это ложный след. Но самое интересное - насколько проще было писать программу, чем думать головой. Код писался просто руками, не думаю. Он не самый быстрый, но возможно, самый наглядный. Это говорит о том, что решение подобных задач требует некой тренировки. В большой степени, это говорит о тренировке, а не о мышлении.

Cделал ф-ей, получающей перемножение возрастов как аргумент от 1 до 100. И мгновенно получил список этих чисел, кроме 36, удовлетворяющих условиям.
Это C#, но будет работать и для JavaScript и Java (кроме печати текста).
Он не самый короткий, но имхо самый понятный и простой, с ним может разобраться любой студент, и даже школьник.
Можно оптимизировать скорость, уменьшить количетсво строк, но это хуже скажется на читаемости.

        public static void F1(  int xyz)
        {
            for (int x = 1; x < xyz; x++)
            {
                for (int y = 1; y < xyz; y++)
                {
                    if (x * y > xyz)
                        continue;
                    for (int z = 1; z < xyz; z++)
                    {
                        if (x * y * z != xyz)
                            continue;

                        // должен быть младший
                        if (x >= y || y > z || x >= z)
                            continue;

                        if( !IsTrollbus(x+y+z, xyz))
                            continue;
                        // результат
                        StringBuilder sb=new StringBuilder();
                        sb.Append("xyz=");
                        sb.Append(xyz);
                        sb.Append(" - x=");
                        sb.Append(x);
                        sb.Append(" y=");
                        sb.Append(y);
                        sb.Append(" z=");
                        sb.Append(z);
                        sb.AppendLine();
                        Console.Write(sb.ToString());
                    }
                }
            }
        }

        private static bool IsTrollbus(int sm, int xyz)
        {
            // возвращает - сколько вариантов возрастов существуют, которые в сумме дают заданную
            // если больше 1, то условие с троллейбусом выполнилось
            int cnt = 0;
            for (int x = 1; x < xyz; x++)
            {
                for (int y = 1; y < xyz; y++)
                {
                    if (x * y > xyz)
                        continue;
                    for (int z = 1; z < xyz; z++)
                    {
                        if (x * y * z != xyz)
                            continue;
                        if (x > y || y > z || x > z)
                            continue;
                        if (sm - x - y - z == 0)
                            cnt++;
                        if (cnt > 1)
                            return true;
                    }
                }
            }
            return cnt > 1;
        }


PS. Достали опечатки, из-за которых пришлось перевыкладывать.

Date: 2011-09-29 08:23 am (UTC)From: [identity profile] jtraub.livejournal.com
Я решал задачу в самом общем виде (вне зависимости от количества сыновей и возрастов).
Вот там выкладывал решение: http://users.livejournal.com/_darkus_/592464.html?thread=12193872#t12193872

Само оно тут: http://pastebin.com/avERExER
Это Python :) По привычке программа вышла в функциональном стиле с list comprehensions и функциями высшего порядка.

Profile

ingenero: (Default)
ingenero

January 2026

S M T W T F S
     1 2 3
4 5678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 5th, 2026 09:04 am
Powered by Dreamwidth Studios