Bola de cristal | Codicioso, Clasificación

14. Bola de cristal

Los grados

10

hora de apertura

Lunes, 14 de septiembre de 2020 12:00

descuento

0,8

Tiempo de descuento

Lunes, 21 de septiembre de 2020 00:00

Se permite la presentación tardía

No

Hora de cierre

Sábado, 10 de octubre de 2020 23:00

Descripción

Como muchas chicas de la misma edad, a Jiulen también le gustan las bolas de cristal.

Quedan 10 días y es su cumpleaños. Jiulen espera poder darle la bola de cristal más grande y atractiva del mundo. Encontró al coleccionista de gemas Arthurs, con la esperanza de buscar su ayuda. Arthurs se movió rápidamente y sacó n piezas de hermosas piedras de cristal cuidadosamente recolectadas. Estas piedras de cristal eran originalmente a, byc de largo, ancho y alto. Arthurs prometió que Jiulian podría tomar una piedra de cristal como materia prima para su regalo.

Al mismo tiempo, Arthurs tiene una especie de magia. Si las dos piedras de cristal rectangulares pueden encajar perfectamente en un lado (un ajuste perfecto significa que los dos lados rectangulares son iguales), entonces se pueden fusionar en un gran tamaño Si la piedra realmente se realiza, ¡entonces Jiulian podría pulir una bola de cristal más grande!

Jiulen espera regalarle la bola de cristal más grande y hermosa. Puedes ayudarla a elegir.


1. Suplemento de conocimientos

       En primer lugar, ponga algunos conocimientos de precalentamiento en la parte superior. La comprensión de este problema es inseparable de la clasificación. Lo más importante es clasificar la estructura.

       Deberías haber aprendido la clasificación burbujeante y la clasificación por selección mientras aprendes c. No sé si lo olvidaste. Las alitas de pollo se han resumido. Puedes revisarlo. Enviado íntimamente al portal:

        Seleccione el tipo de        inserción de clasificación,

       pero la biblioteca de algoritmos de c ++ ya ha logrado una buena función de clasificación , ciertamente debe escribir más rápido y mejor que usted, y puede lograr muchos otros tipos de clasificación: int, char ... el más fuerte Sí, puedes ordenar la estructura . Si no está familiarizado con el uso de la función de clasificación, primero debe leer este artículo resumido en Alitas de pollo: Algoritmo de clasificación | Uso de la función de clasificación, y luego mirar la solución; de lo contrario, puede sentirse avergonzado ~

2. Pretratamiento

       Esta pregunta es una pregunta codiciosa muy típica, y la idea es muy simple si quieres entenderla.

       Para que los datos sean más fáciles de procesar, esperamos almacenar los datos de cada cuboide juntos (debido a que la salida necesita marcar el cuboide, necesitamos registrar la identificación además de los datos de longitud, ancho y altura), luego se debe usar un cristal de estructura para describir los datos del cuboide . Necesitamos una matriz de estructura crl [] para almacenar todos los cuboides . La definición de estructura y la declaración de matriz de estructura son las siguientes:

struct crystal {
    long long id;  //水晶石的标号
    long long length, width, height; //水晶石的长宽高
} crl[MAXN];

        A continuación, analice algunos puntos importantes:       

        En primer lugar, debemos entender que el tamaño de la bola de cristal está completamente determinado por el lado más corto del cuboide. ¡Nuestro objetivo es hacer que el lado más corto sea el más largo!

        Luego, para un cuboide (largo, ancho, alto), para facilitar el procesamiento, debe especificar: largo> ancho> alto . Este paso se puede realizar mientras se procesa la entrada. Entonces, al fusionar bolas de cristal, solo necesitamos seleccionar largo * ancho para fusionar las caras y aumentar el lado más corto. ¡No tiene sentido fusionar otras caras, porque el lado más corto no aumenta por naturaleza!
 

3. Algoritmo central


Después del preprocesamiento, el procesamiento se divide en dos partes:

1. Sin fusionar,
        atraviese cada cuboide en la matriz de estructura uno por uno, encuentre la altura más grande y registre su id (número) correspondiente.

2.
       Primero fusione la matriz de estructura, primero ordene por palabra clave de longitud, si son iguales, ordene por ancho, y si son iguales, ordene por alto.
       Después de ordenar de esta manera, el caso de que las caras de largo * ancho se puedan fusionar solo aparecerá en el cuboide adyacente , por lo que solo debemos considerar la fusión del cuboide adyacente. ¡Redujo enormemente la frecuencia de nuestras discusiones!


        A continuación, enumeramos uno por uno si los cuadros adyacentes se pueden fusionar: si se pueden fusionar, calcule el lado más corto después de la fusión. Si es más largo que el lado más largo y más corto actual, actualice el lado más largo y más corto y deje los dos identificadores correspondientes.

        Por ejemplo, el resultado combinado del paralelepípedo rectangular A1 (largo, ancho, alto1) y el paralelepípedo rectangular A2 (largo, ancho, alto2) es: (largo, ancho, alto1 + alto2). Tenga en cuenta que el lado más corto después de la fusión es: min (ancho, alto1 + alto2) .
 


El código completo se adjunta a continuación:

#include <cstdio>
#include <algorithm>

#define MAXN 100050

using namespace std;

struct crystal {
    long long id;  //水晶石的标号
    long long length, width, height; //水晶石的长宽高
} crl[MAXN];

bool cmpForStruct(struct crystal x, struct crystal y) {
    if (x.length != y.length)  //先按长度排序
        return x.length > y.length;
    else if (x.width != y.width)  //再按宽度排序
        return x.width > y.width;
    else
        return x.height > y.height;   //最后按照高度排序
}

int main() {
    long long n;
    scanf("%lld\n", &n);

    long long maxHeight = 0;  //记录水晶石的最高高度
    long long x = 0, y = 0;  //记录选择水晶石的标号,当不可以合并时,只取x

    for (long long i = 0; i < n; i++) {
        long long temp[3];  //暂用来排序的数组
        scanf("%lld%lld%lld", &temp[0], &temp[1], &temp[2]);  //将输入的长宽高先放到数组temp中
        sort(temp, temp + 3);  //对temp数组[0,2]进行从小到大排序

        //将输入更新到结构体数组中
        crl[i].id = i + 1;
        crl[i].length = temp[2];
        crl[i].width = temp[1];
        crl[i].height = temp[0];

        //记录单个水晶石的最大高度
        if (crl[i].height > maxHeight) {
            maxHeight = crl[i].height;
            x = crl[i].id;  //记下标号
        }
    }

    sort(crl, crl + n, cmpForStruct);  //对水晶石结构体数组[0,n-1]进行排序,按照长、宽、高优先级排序

    //依次讨论相邻水晶石合并的问题
    for (long long i = 0; i < n - 1; i++) {
        if (crl[i].length == crl[i + 1].length && crl[i].width == crl[i + 1].width) {
            long long temp = crl[i].height + crl[i + 1].height;  //合并

            //计算合并之后的最短边
            if (temp > crl[i].width)
                temp = crl[i].width;

            //更新两个水晶石的最大高度
            if (temp > maxHeight) {
                maxHeight = temp;
                x = crl[i].id;  //记下标号,不要以为下标+1就是id,你要记得我们对结构体数组排序过....
                y = crl[i + 1].id;
            }
        }
    }

    if (y == 0)
        printf("%d\n%lld\n", 1, x);
    else
        printf("%d\n%lld %lld\n", 2, x, y);


}


final 

Bienvenido a prestar atención a la cuenta pública personal "  Programación de ala de pollo" , aquí hay un granjero de código serio y de buen comportamiento.

---- Sea el blogger más educado y el programador más sólido ----

Trate de escribir cada artículo con cuidado y, por lo general, resuma las notas en actualizaciones automáticas ~

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_43787043/article/details/108594129
Recomendado
Clasificación