Как я могу распределить элементы основного соглашения по двум другим соглашениям как можно более сбалансированным?

У меня есть набор из 2N игроков, у каждого из которых числовой показатель больше нуля, который определяет качество как игрока. Из этого набора игроков я должен создать две команды из N игроков, A и B, чтобы сумма показателей качества их компонентов была как можно более сходной.

У меня есть этот подготовленный

import java.util.Arrays;

class Main {
  public static void main(String[] args) {
    //Arreglo de jugadores
        int[] equipoDeJuego = {8,8,9,6,1,7,1,3,7,5}; 
        int fuerzaA=0;
        int fuerzaB=0;

        //Equipo A
        int[] A=new int[10];

        //Equipo A
        int[] B= new int[10];

        //Se imprime la cantidad de los jugadores
        //System.out.println("Cantidad de jugadores: "+equipoDeJuego.length);

        //Ordenamos el arreglo de manera creciente
        Arrays.sort(equipoDeJuego);



        for(int i=0; i<(equipoDeJuego.length)/2; i++) {

            //Integrantes del primer arreglo
            A[i]=equipoDeJuego[i];
            System.out.print("Equipo A:"+A[i]+" ");

            fuerzaA+=A[i];
        }
        System.out.println("Fuerza equipo A: "+fuerzaA);
        System.out.println();


      for(int i=5; i<10; i++) {

            //Integrantes del segundo arreglo
            B[i]=equipoDeJuego[i];
            System.out.print("Equipo B:"+B[i]+" ");
            fuerzaB+=B[i];

        }
        System.out.println("Fuerza equipo B: "+fuerzaB);



        int dF= fuerzaB-fuerzaA;
        System.out.println("La diferencia es: "+dF);


  }
}

Этот код, который я сделал, понял, что он не решает проблему эффективно, потому что я открыл компьютер, который будет иметь A = (1,1,1,1,1,1) и команда B = (6), покачивается, но я знаю, что это не лучшая практика.

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

Пример:

int[] equipoDeJuego = {8,8,9,6}; 
Equipo A={8,9}; 
Equipo B={8,6}; 
1
задан 10.06.2019, 21:40
1 ответ

Это проблема particiГіn. У него есть несколько решений, лучшие одни другие не так. Мое предложение достаточно плохое. Я помещаю тебя aquГ - немного cГіdigo, где a1 - предложение mГ - в наверху и a2 один mГ©todo что-то лучше, но даже asГ - он не дает слишком хорошие результаты.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Team {

    public static void main(String[] args) {

        // jugadores
        Integer[] equipoDeJuego = { 8, 8, 9, 6, 1, 7, 1, 3, 7, 5 };

        int f = 0;
        for (int i = 0; i < equipoDeJuego.length; i++) {
            f += equipoDeJuego[i];
        }
        System.out.println("Fuerza total: " + f + ", fuerza media: " + ((float) f / 2));

        a1(equipoDeJuego);

        a2(equipoDeJuego);

    }

    static void a1(Integer[] equipo) {
        System.out.println("Intento 1");

        // el tamaño del equipo resultante sería la mitad del número de jugadores
        int size = equipo.length / 2;

        // Equipo A (el nombre en minúsculas que es más javero)
        int[] a = new int[size];

        // Equipo B (idem)
        int[] b = new int[size];

        int fuerzaA = 0;
        int fuerzaB = 0;

        // ordenar
        Arrays.sort(equipo);

        int counter = 0;
        for (int i = 0; i < equipo.length; i += 2) {
            a[counter] = equipo[i];
            b[counter] = equipo[i + 1];
            counter++;
        }

        System.out.print("Equipo A: ");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + ",");
            fuerzaA += a[i];
        }
        System.out.println("\tFuerza equipo A: " + fuerzaA);

        System.out.print("Equipo B: ");
        for (int i = 0; i < b.length; i++) {
            System.out.print(b[i] + ",");
            fuerzaB += b[i];
        }
        System.out.println("\tFuerza equipo B: " + fuerzaB);

        // hay un reparto más justo:
        // 1 3 6 8 9 -> 27
        // 1 5 7 7 8 -> 28
    }

    static void a2(Integer[] equipo) {
        System.out.println("Intento 2");

        int size = equipo.length / 2;

        List<Integer> equipoA = new ArrayList<>();
        List<Integer> equipoB = new ArrayList<>();

        int fuerzaA = 0;
        int fuerzaB = 0;

        // ordenar
        Arrays.sort(equipo);

        // hay que iterar en orden inverso
        for (int i = equipo.length - 1; i >= 0; i--) {
            if (sum(equipoA) < sum(equipoB)) {
                equipoA.add(equipo[i]);
            } else {
                equipoB.add(equipo[i]);
            }
        }

        // esto es un ajuste por si las dos listas no terminan con el mismo tamaño movemos el último elemento
        // pero si las dos listas son muy desiguales esto no funciona
        if (equipoA.size() > equipoB.size()) {
            Integer temp = equipoA.remove(equipoA.size() - 1);
            equipoB.add(temp);
        }
        if (equipoB.size() > equipoA.size()) {
            Integer temp = equipoB.remove(equipoB.size() - 1);
            equipoA.add(temp);
        }

        Integer[] a = new Integer[size];
        Integer[] b = new Integer[size];

        // las listas a arrays
        equipoA.toArray(a);
        equipoB.toArray(b);

        System.out.print("Equipo A: ");
        for (int i = 0; i < a.length; i++) {
            if (a[i] == null) {
                break;
            }
            System.out.print(a[i] + ",");
            try {
                fuerzaA += a[i];
            } catch (Exception e) {
                // por si queda algún null
            }
        }
        System.out.println("\tFuerza equipo A: " + fuerzaA);

        System.out.print("Equipo B: ");
        for (int i = 0; i < b.length; i++) {
            if (b[i] == null) {
                break;
            }
            System.out.print(b[i] + ",");
            try {
                fuerzaB += b[i];
            } catch (Exception e) {
                //
            }
        }
        System.out.println("\tFuerza equipo B: " + fuerzaB);

    }

    // suma de los elementos de una lista de enteros
    private static int sum(List<Integer> a) {
        int sum = 0;
        for (Integer i : a) {
            sum += i;
        }
        return sum;
    }

}

, Если ты хочешь продолжить исследовать - aquГ - у тебя есть немного сложный пример, но у него есть хорошая внешность и осуществи несколько алгоритмов. И чтобы не делать меньше wikipedia , немного teorГ - в.

0
ответ дан 25.10.2019, 06:07

Теги

Похожие вопросы