[Off] competición por equipos de ganado

[Preguntas de programación] concurso de equipo de
este enlace mencionar: https :? //Www.nowcoder.com/questionTerminal/6736cc3ffd1444a4a0057dee89be789b orderByHotValue = 1 & page = 1 y onlyReference = false

Índice de calor: 3071 Tiempo límite: C / C ++ de 1 segundo, otros idiomas 2 segundos a las limitaciones de espacio: C / C ++ 32M, otros idiomas 64M
conocimiento algoritmo de vídeo para explicar
ternera llevó a cabo un concurso de programación, participar en la competición tienen los jugadores 3n, cada jugador tenemos un a_i valor de nivel. ahora estos jugadores quieren unirse para formar un total de n número de equipos que cada equipo de tres personas. Vaca encontró que el nivel es igual al valor de los jugadores del equipo en el equipo el segundo valor más alto.
Por ejemplo:
el nivel del valor de un equipo de tres jugadores son 3,3,3 entonces el valor del equipo es el nivel 3.
Un equipo de tres niveles de jugadores de valor son 3,2,3 entonces el valor del equipo es el nivel 3.
equipo A los valores de nivel de los tres jugadores son 1,5,2. nivel 2 a continuación, es el valor del equipo
para hacer el juego más de aspecto, el equipo de Tauro le gustaría disponer la suma horizontal de los valores máximos para todos los equipos.
Como se muestra en la muestra:
si la carne de vacuno se divide en los seis miembros de dos equipos
si esquema:
TEAM1: {1, 2,5}, Team2: {5,5,8}, lo que era 7,5 vez el valor total de nivel
y Si el esquema:
TEAM1: {2,5,8}, Team2: {1,5,5}, esta vez es la suma del valor de nivel 10
no es mayor que la suma de esquema 10, la salida 10.
Descripción de entrada:
de entrada llevar a cabo una primera entero positivo n (1 ≤ n ≤ 10 ^ 5)
una segunda fila que comprende números enteros 3n a_i (1 ≤ a_i ≤ 10 ^ 9), indicativa del valor de nivel para cada concursante.
Descripción de salida:
salida de un número entero representa el nivel máximo del valor total de todos los equipos.
ejemplo 1
de entrada
2
528.515
de salida
10

determinación tema
esta pregunta el significado de los problemas, se trata de una cuestión relativa a la solución óptima, tres par se determina por el valor del número de equipos inscritos n la primera línea, nos aseguramos el máximo valor para el valor de la suma de todos los equipos de nivel, tenemos que hacer ocupa el segundo valor más alto lo más grande posible. Por lo tanto, el valor máximo en el extremo derecho, es el lugar más pequeño a la izquierda.
Ideas de resolución de problemas
idea principal 1. Este título es un algoritmo voraz que se seleccionó la solución localmente óptima se puede ver cuando el valor actual de cada elección, por lo que aquí es codicioso asegúrese de que el segundo valor con el valor máximo que puede tomar cada grupo puede ser seleccionado, cada vez que intenta conseguir el máximo, pero el valor máximo de cada grupo fueron menos que en el derecho, deberíamos ir en el medio de cada uno del segundo valor más grande .
2. Ordenar, cómo hacer que el valor de cada grupo eran el segundo mayor en el medio, primero en orden ascendente, un total de 3 * n elementos, antes de [0-n-1] -ésimo elemento de la matriz debe ser comparado con la parte posterior , el valor más pequeño. El número mínimo de cada grupo, ya que entró en el, el número restante de la izquierda dos y ha ordenado a un grupo de dos, lo comprueba en el índice de la matriz, que es dos veces el número en cada grupo una gran suma al número de valor de la suma nivel óptimo de todos los equipos obtener toda la cuestión de la máxima. El índice correspondiente se retira entonces marcado 3n - 2,3n - 4, 3n - 4 ... n + 2, la posición del elemento de n puede ser acumulado.
Leer el texto puede ser demasiado herida en el mapa:
Aquí Insertar imagen Descripción
la implementación del código:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    while(cin>>n)  //首先输入队伍的个数,每队有三人
    {
        vector<int> array;//定义数组
        array.resize(3*n);//给这个数组开空间
        for(int i = 0;i < (3*n);i++)//循环输入数据
        {
            cin>>array[i];
        }
        long long  sum = 0;//sum存放每队水平最优解之和,此题的解
        sort(array.begin(),array.end());
        //将数组中元素进行升序,有序后【0-n-1】这n个数作为每队中的最小值,剩余的数两两一组,去第一个做中间值,
        for(int i = n;i <= 3 * n - 2;i+=2)
        {
            sum += array[i];
        }
        cout<<sum<<endl;
    }
}
Publicado 51 artículos originales · ganado elogios 229 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/famur/article/details/105199256
Recomendado
Clasificación