Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 10.11.2018
Сообщений: 23

Эффективность и рекурсия

09.01.2019, 22:47. Показов 1689. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Вопрос на тему: Эффективность и рекурсия
Амир и Тамар играют в игру.
В ряду находятся положительные числа. Каждый игрок по очереди выбирает числа и только с края ряда и кладет к себе в кассу. Оба игрока знают значения каждого из чисел. Количество чисел четное, т.е. у каждого игрока будет одинаковое количество выборов
Например такой ряд:
15 25 18 ………….. 22 30 18
Каждый игрок по очереди выбирает числа и только с краю и кладет к себе в кассу.
После K выборов каждым игроком, заканчиваются числа в ряду, и считают сумму набранных чисел и выигрывает тот, у кого сумма больше. Либо ничья, если суммы одинаковые.
Амир берет первым. Он хочет выиграть, либо закончить ничьей. Нужно найти стратегию для Амира, которая это обеспечит.
Амир может заранее посчитать числа и сумму чисел.
Предположим, одномерный массив arr который включает этот ряд.
Надо написать статический метод с именем win, который будет гарантировать что Амир не проиграет.
Метод принимает массив чисел в качестве параметра и отображает выбор игроков в каждом выборе.
В конце процесса должно быть напечатано, какая общая сумма будет у Амира и общая сумма у Тамар.
В методе нужно предположить, что когда выбирает Тамар, то она всегда будет выбирать самое большое из двух чисел по краям.
Подпись метода:
public static void win (int [] arr)
Например, если список чисел в массиве
15 19 21 13 14 30 23 16
То вывод для игры будет:
Amir took 16
Tamar took 23
Amir took 30
Tamar took 15
Amir took 19
Tamar took 21
Amir took 13
Tamar took 14
Final Score:
Amir total 78
Tamar total 73

Похоже, что правильное решение – это дать Амиру посчитать сумму чисел в ряду на четных и на нечетных местах. И скажем, если он посчитал, что сумма на нечетных местах больше и так как он начинает первым, то он будет выбирать только числа, находящиеся на нечетных местах, даже несмотря на то, что Тамар выбирает всегда максимальное число с краев, то ей все равно всегда будут доставаться четные места, которые в итоге в сумме дадут меньше, чем у Амира. И так же с четными местами.
То, что я сделала - неправильно:
Java
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public class Ex14 {
 
    /**
     * win describes a game process of a certain strategy
     * by which Amir will assure not loosing. 
     * The strategy is as follows: Amir chooses first. Amir always chooses a number in a way
     * that his sum balance will be larger then Tamar sum balance after her turn.
     * He uses his knowledge of Tamar strategy that simply chooses a larger of two numbers. 
     * 
     *  The time complexity is : O(k) when k is number of elements in array,
     *  because every cycle 2 numbers will be chosen and never go back
     *  The space complexity is also O(k)
     * 
     * @param arr - array of numbers
     */ 
    public static void win(int[] arr) {
        
        int sumAmir = 0;
        int sumTamar = 0;
        
        int start = 0;
        int end = arr.length-1; 
        
        while (end - start >= 2) {
            int a = arr[start];
            int b = arr[end];
            int C = arr[start+1];
            int D = arr[end-1];
            boolean amirTook = false;
            
            if ( a>=b ) {
                if (( (sumAmir + a) >= (sumTamar + C)) && ((sumAmir + a) >= (sumTamar + b))) {
                    sumAmir = sumAmir + a;
                    start++;
                    System.out.println("Amir took " + a);
                    amirTook = true;
                }
            } else {
                if (( (sumAmir + b) >= (sumTamar + a)) && ((sumAmir + b) >= (sumTamar + D))) {
                    sumAmir = sumAmir + b;
                    end--;
                    System.out.println("Amir took " + b);
                    amirTook = true;
                }
            }
            
            if (!amirTook) {
                if (a>=b) {
                    sumAmir = sumAmir + a;
                    start++;
                    System.out.println("Amir took " + a);
                    amirTook = true;
                } else {
                    sumAmir = sumAmir + b;
                    end--;
                    System.out.println("Amir took " + b);
                    amirTook = true;
                }
            }
            
            if (arr[start] >= arr[end]) {
                sumTamar = sumTamar + arr[start];
                System.out.println("Tamar took " + arr[start]);
                start++;
            }
            else {
                sumTamar = sumTamar + arr[end];
                System.out.println("Tamar took " + arr[end]);
                end--;              
            }
        }
        
        if (arr[start] >= arr[end]) {
            System.out.println("Amir took " + arr[start]);
            start++;
        }
        else {
            System.out.println("Amir took " + arr[end]);
            end--;
        }
        System.out.println("Tamar took " + arr[start]);
        
        System.out.println("Final Score:");
        System.out.println("Amir total " + (sumAmir + arr[start]));
        System.out.println("Tamar total " + (sumTamar + arr[start]));
    }
Прошу помощи написать правильно. Спасибо отвечающим!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2019, 22:47
Ответы с готовыми решениями:

Найти первые N чисел Фибоначчи (рекурсия/итерация, сравнить эффективность)
Найти первые N чисел Фибоначчи двумя способами: с помощью рекурсии и с помощью итерации. Сравнить эффективность алгоритмов.

Рекурсия. Рекурсия с мемоизацией. (полная версия в печатном варианте, работа со словами и строками)
Прошу помочь, может было у кого похожее задание, пока выгружу и продолжу выполнять. Буду благодарен любой помощи. Входной текст состоит...

эффективность адурелки
Подскажите плз. как лучше добавить сайт (страницы) в яндекс 1. Адурелка 2. Ссылки с других сайтов Что эффективнее? Кто-то...

12
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
10.01.2019, 09:41
...

Добавлено через 15 минут
Цитата Сообщение от Alinari Посмотреть сообщение
это дать Амиру посчитать сумму чисел в ряду на четных и на нечетных местах
не, этого недостаточно, например, для ряда 1, 10000, 1,1,1 - кто возьмет первое или третье число, тот проиграет
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
10.01.2019, 11:15
Цитата Сообщение от xoraxax Посмотреть сообщение
не, этого недостаточно, например, для ряда 1, 10000, 1,1,1 - кто возьмет первое или третье число, тот проиграет
Думаю, предполагается, что все числа в ряду более-менее равномерно распределены в некотором относительно небольшом диапазоне, например от 10 до 30, без однозначно выигрышных максимумов. т.к. в предложенном тобой ряде, всегда выигрывает тот, кто ходит вторым (если он не идиот, конечно), и смысл игры теряется.
0
0 / 0 / 0
Регистрация: 10.11.2018
Сообщений: 23
10.01.2019, 11:32  [ТС]
По условию количество чисел в ряду чётное. Возьмём пример похожий на ваш: 1,1,10000,1,1,2. Амир считает сумму и понимает что на нечётных местах сумма больше. Поэтому берет первую единицу, Тамар берет 2, Амир берет предпоследнюю единицу, Тамар берет одну из оставшихся единиц, Амир берет 10000. Таким образом его стратегия: брать всегда то число которое стоит на четном или нечётном месте, в зависимости от того сумма которых больше, которую он посчитал до начала игры.

Добавлено через 9 минут
неважно какой ряд и какие числа в нем. Речь идет о стратегии. Преимущество у того, кто берет первым и посчитал сумму чисел на четных и на нечетных местах перед началом игры
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
10.01.2019, 12:08
Alinari, можно взять либо первый элемент, либо последний, если я беру первый элемент, то нечетные элементы становятся четными, как нам поможет вычисление твоей суммы?
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
10.01.2019, 12:24
Alinari, Непонятная у вас стратегия. Амир может взять 2 и получить еще больше. При уменьшении всего ряда в последный момент может поменятся выиграшный (четный/не четный), и во вторых сумма накопленых ошибок даст о себе знать.
Я бы взял тупым перебором, так будет наверняка.
Например что-то типа такого
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int[] ar = {....};  // длинна массива 20
int[] result = new int[10];  // результат
int[] res = new int[10];      // временный результат
int score = 0;
for(int i=2^9; i<2^10;i++) {  // перебираем все возможные варианты
int L=0, R = ar.lenght -1, index =0;  // индексы слева, справа, и заполнения
String[] aStr = Integer.toBinaryString(2^9 + i).split(""); // генерируем вариант перебора
Boolean arB = Arrays.stream(aStr).map(Boolean::getBoolean).toArray(); // работаем с булевыми перем.
for(Boolean b : arB) {  
      if(b) {     // если true берем слева
         res[index] = a[L]; L++; 
      } else {   // если false берем справа
        res[index] = a[R]; R--;
      } index++;
     }
     // ну и дальше проверять очки 
     int score2 = Arrays.stream(res).sum();
    if(score2 > score) {
       // заполнить массив  result значениями их res
    }
Это всего лишь алгоритм а не код. Я вчера хотел его реальзовать, потом что-то не пошло и я его удалил. Сейчас его набросал по памяти..
0
0 / 0 / 0
Регистрация: 10.11.2018
Сообщений: 23
10.01.2019, 12:30  [ТС]
мой вариант базируется на четных или нечетных местах изначально, то есть до начала игры.
Возьмем такой ряд и пронумеруем под ним четные и нечетные места.
16 25 15 30 18 18
1 2 3 4 5 6
Амир посчитал, что сумма больше на четных местах. Поэтому он теперь всегда будет брать те числа которые изначально были пронумерованы четными местами.
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
10.01.2019, 12:54
Alinari, В принципе ваша стратегия позволяет Амир как минимум не проиграть.
Очков будет не самое большое возможное значение, но не проиграете.
0
0 / 0 / 0
Регистрация: 10.11.2018
Сообщений: 23
10.01.2019, 13:16  [ТС]
именно. Не поиграть. как это осуществить в Java?
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
10.01.2019, 13:29
Цитата Сообщение от Alinari Посмотреть сообщение
как это осуществить в Java?
Что именно, сравнить сумму четных и нечетных элементов?
0
0 / 0 / 0
Регистрация: 10.11.2018
Сообщений: 23
10.01.2019, 14:34  [ТС]
ViktorFX, написать код согласно условию
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
10.01.2019, 18:49
Лучший ответ Сообщение было отмечено Alinari как решение

Решение

Alinari, дабу
Java
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
public void game(int[] gameField) {
        int amirScore = 0;
        int tamarScore = 0;
        int start = 0;
        int end = gameField.length - 1;
 
        int index = 0;
        int oddsSum = 0;
        int evenSum = 0;
        while (index < gameField.length) {
            evenSum += gameField[index++];
            oddsSum += gameField[index++];
        }
        boolean variant = evenSum > oddsSum;
 
        int value;
        while (start < end) {
 
            value = variant ? (start % 2 == 0 ? gameField[start++] : gameField[end--]) :
                    (start % 2 != 0 ? gameField[start++] : gameField[end--]);
 
            amirScore += value;
            System.out.println("Amir took: " + value);
 
            value = gameField[start] > gameField[end] ? gameField[start++] : gameField[end--];
            tamarScore += value;
            System.out.println("Tamar took: " + value);
        }
        System.out.println("\nFinal score:");
        System.out.println("Amir total: " + amirScore);
        System.out.println("Tamar total: " + tamarScore);
 
    }
Bash
1
2
3
4
5
6
7
8
9
10
11
12
Amir took: 16
Tamar took: 23
Amir took: 30
Tamar took: 15
Amir took: 19
Tamar took: 21
Amir took: 13
Tamar took: 14
 
Final score:
Amir total: 78
Tamar total: 73
Добавлено через 24 минуты

Не по теме:

Какой-то тернарник у меня подозрительный...

1
0 / 0 / 0
Регистрация: 10.11.2018
Сообщений: 23
10.01.2019, 19:38  [ТС]
iSmokeJC, спасибо, это то, что нужно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2019, 19:38
Помогаю со студенческими работами здесь

Эффективность перевозок
Мне надо написать программу на clips, которая будет рассчитывать эффективность перевозок из Москвыв Питер, т.е пользователь вводит кол-во...

эффективность сравнения
вот у меня 2 метода решения линейных уравнения гаусса и простой итерации нужно сравнить быстродействие использовал функцию gettickcount...

Эффективность рекламы
Привет всем, Подскажите пожалуйста какие средние показатели должны быть для сайта игровой тематики (игры, он-лайн игры и т.д.). Меня...

Эффективность ссылок
Доброй ночи! Подскажите пожалуйста, почему покупные ссылки с фрихостов меньше ценятся даже если хороший pr и не нулевой тИЦ? Или это...

эффективность алгоритма
кнут &quot;искусство программирования&quot;, том 1, 3-е издание, 35 страница я не понял запись ограничения для эффективности алгоритма(формулы...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru