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

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

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

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

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 5 678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 6th, 2026 06:43 pm
Powered by Dreamwidth Studios