JavaRush /Java блог /Архив info.javarush /Интересная задача
mr__lordi
20 уровень

Интересная задача

Статья из группы Архив info.javarush
Имеется четыре острова: А, B, C, D. На трех островах (A, B, C) по 2000 жителей, а на D - 2015. Можно ли через какое-то количество дней сделать, чтобы на островах B, C, D было 2000 жителей, а на А - 2015, если каждый день с одного из островов на все остальные переселяется по одному человеку.

Можно ли решить это задание? Буду благодарен за любую помощь.
Комментарии (27)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Busockiy Уровень 27
1 сентября 2015
«timurnav прав — задача не имеет решения, точнее решение в том, что остров А при поочерёдном переселении никогда не достигнет числа населения 2015. :)» — где здесь сказано что это поочерёдное переселение?
Grif Уровень 11
1 сентября 2015
Кстати прошу прощение за код который я выложил без форматирования… в спешке…
должно было быть так:

import java.util.ArrayList;

public class TestIsland
{
    public static void main(String[] args)
    {
        int checkNumber = 2015;
        String checkName = "A";
        ArrayList<Island> islands = new ArrayList<Island>();
        for (int i = 0; i < 4; i++)
        {
            islands.add(new Island());
        }
        islandsInitializer(islands, 0, checkName, 2000);
        islandsInitializer(islands, 1, "B", 2000);
        islandsInitializer(islands, 2, "C", 2000);
        islandsInitializer(islands, 3, "D", checkNumber);
        System.out.println("***** Until the resettlement ******");
        printPeopleOnIsland(islands);
        System.out.println("***** resettlement ******");
        for (int i = 0; i < 10; i++)
        {
            relocation(islands);
            rotateIslands(islands);
            System.out.println("Passed the day: " + i);
            if (checkIsland(islands, checkName, checkNumber))
            {
                System.out.println("Islands " + checkName +
                        "population is" + checkNumber);
                break;
            }
            printPeopleOnIsland(islands);
        }
        printPeopleOnIsland(islands);
    }

    public static void rotateIslands(ArrayList<Island> list)
    {
        list.add(0, list.get(list.size() - 1));
        list.remove(list.size() - 1);
    }

    public static boolean checkIsland(ArrayList<Island> list,
                                      String checkName, int number)
    {
        boolean flag = false;
        for (int i = 0; i < list.size(); i++)
        {
            if (list.get(i).getName().equals(checkName) &&
                    list.get(i).getPe
Busockiy Уровень 27
1 сентября 2015
public class Islands
{
    public static void main(String[] args)
    {

        int A = 2000;
        int B = 2000;
        int C = 2000;
        int D = 2015;
        int q = 0;
        while (true)
        {
            System.out.println(q++);
            int e = (int) (Math.random() * 4 + 1);
            if (e == 1)
            {
                A = A - 3;
                B = B + 1;
                C = C + 1;
                D = D + 1;

            }
            else if (e == 2)
            {
                B = B - 3;
                A = A + 1;
                C = C + 1;
                D = D + 1;

            }
            else if (e == 3)
            {
                C = C - 3;
                A = A + 1;
                B = B + 1;
                D = D + 1;

            }
            else if (e == 4)
            {
                D = D - 3;
                A = A + 1;
                B = B + 1;
                C = C + 1;

            }
            if (B == 2000 && C == 2000 && D == 2000 && A == 2015)
            {
                break;
            }
            if (B == 2015 && C == 2000 && D == 2000 && A == 2000)
            {
                break;
            }
            if (B == 2000 && C == 2015 && D == 2000 && A == 2000)
            {
                break;
            }

            if (A > 2030 || B > 2030 || C > 2030 || D > 2030)
            {
                 A = 2000;
                 B = 2000;
                 C = 2000;
                 D = 2015;
            }

        }
        System.out.println("Задача решена");
        System.out.println("A = " + A + " B = " + B + " C = " + C + "D = " + D );
    }
}
Busockiy Уровень 27
1 сентября 2015
Спустя час не решилось…
public class Islands
{
    public static void main(String[] args)
    {

        int A = 2000;
        int B = 2000;
        int C = 2000;
        int D = 2015;
        while (true)
        {
            int e = (int) (Math.random() * 4 + 1);
            if (e == 1)
            {
                A = A - 3;
                B = B + 1;
                C = C + 1;
                D = D + 1;

            }
            else if (e == 2)
            {
                B = B - 3;
                A = A + 1;
                C = C + 1;
                D = D + 1;

            }
            else if (e == 3)
            {
                C = C - 3;
                A = A + 1;
                B = B + 1;
                D = D + 1;

            }
            else if (e == 4)
            {
                D = D - 3;
                A = A + 1;
                B = B + 1;
                C = C + 1;

            }
            if (B == 2000 && C == 2000 && D == 2000 && A == 2015)
            {
                break;
            }
            if (B == 2015 && C == 2000 && D == 2000 && A == 2000)
            {
                break;
            }
            if (B == 2000 && C == 2015 && D == 2000 && A == 2000)
            {
                break;
            }

            if (A > 2030 || B > 2030 || C > 2030 || D > 2030)
            {
                 A = 2000;
                 B = 2000;
                 C = 2000;
                 D = 2015;
            }

        }
        System.out.println("Задача решена");
        System.out.println("A = " + A + " B = " + B + " C = " + C + "D = " + D );
    }
}
Airo Уровень 23
1 сентября 2015
Я думаю можно, через 15 дней!
Если, конечно, я правильно понял — алгоритм такой
1 день — с А на В, с В на С, с С на А, с D на А
2 день — с А на В, с В на С, с С на А, с D на А
timurnav Уровень 21
1 сентября 2015
Решение сводится к тому, чтобы найти алгоритм по которому мы сможем сделать равными B, C и D.
если отбросить мишуру, у нас остается только
B=0, C=0 и D=15.
а так же возможные действия:
1. инкремент/декремент всех чисел разом
2. вычесть из одного из чисел 3, и добавить к двум оставшимся по 1
0 0 15
или
n n n+15
рассмотрим операции которыми мы можем воспользоваться.
+1 +1 -3, воспользуемся инкрементом и приведем, +4 +4 0 или 0 0 -4 (кому как нравится)
таким образом, чтобы скомпенсировать итерации и сделать сделать все три числа равными, ряд должен принять форму
n n n+k,
где k — число делящееся на 4 без остатка.
15 не делится — следовательно, задача не может быть решена