Resolución de problemas de la estrella Baidu 2023

BD202309 Viaje interestelar

En las profundidades del universo, la flota interestelar parte de la tierra y se dirige al desconocido abismo interestelar. Esta flota es la cristalización de la última tecnología y está formada por nn naves espaciales interestelares, cada una de las cuales es como una estrella brillante que navega silenciosamente a través del abismo del universo.

El viaje de la nave espacial es silencioso y misterioso, como un fantasma navegando por el universo, viajando silenciosamente entre las estrellas. Sin embargo, este tranquilo cielo estrellado no es seguro y en cualquier momento pueden surgir peligros desconocidos. Esto requiere que los miembros de la flota permanezcan alerta en todo momento, como si se enfrentaran a un enemigo poderoso.

Sin embargo, el viaje no transcurrió tan bien como se esperaba. En algún lugar profundo del cielo estrellado, la flota recibió una alerta del dispositivo de detección de la Tierra. La flota había entrado en el área de detección de la civilización alienígena. La flota esperaba organizarse en una línea recta continua para reducir la posibilidad de que la flota fuera detectada . por una civilización alienígena.

Cada nave espacial puede considerarse como un punto en el espacio tridimensional, y la ii-ésima nave espacial puede representarse mediante coordenadas tridimensionales (x_i,y_i,z_i)(xi​,yi​,zi​). Las coordenadas de n naves espaciales dispuestas en una línea recta continua deben cumplir las siguientes condiciones: dos de estas coordenadas puntuales tienen las mismas dimensiones y la dimensión restante debe formar una secuencia entera continua. Por ejemplo, cuando x_1=x_2=…=x_nx1​=x2​=…=xn​ y y_1=y_2=…=y_ny1​=y2​=…=yn​ y |z_i-z_{i-1}|=1 ∣ Cuando zi​−zi−1​∣=1 (i=2…ni=2…n), se puede considerar que estos puntos están en una línea recta continua. Tenga en cuenta que en el ejemplo anterior, las coordenadas dimensionales x, yx e y de nn puntos son las mismas. También pueden ser las mismas coordenadas dimensionales y, zy y z o las coordenadas dimensionales x, zx y z. Además, el orden final de los barcos no tiene nada que ver con el orden de entrada.
Dado que la navegación de la nave espacial en el universo está limitada por el cielo estrellado, la nave espacial sólo puede volar en cualquier momento a lo largo de una de las tres dimensiones y cada unidad de movimiento consume una unidad de energía.

A pesar de la emergencia, la flota aún necesitaba prepararse para viajes posteriores. Como miembro de la flota, debes indicar la cantidad mínima de energía consumida por la flota en línea recta continua.

Formato

Formato de entrada:

En la línea 11, la entrada es el número entero nn (1 \le n \le 10^51≤n≤105); las
siguientes líneas nn contienen tres números, que representan las coordenadas de cada nave espacial, x, y, z (- 10^ 6 \le x,y,z \le 10^6)x,y,z(−106≤x,y,z≤106) .

Formato de salida:

Un número por línea, que indica la cantidad mínima de energía consumida.

Muestra 1

ingresar:

3 
2 0 2 
6 35 -87 
0 184 -126

Producción:

316
Observación

Explicación de ejemplo: Un conjunto factible de soluciones es:
mover la x de todos los puntos a 2 con un costo de |2-2|+|6-2|+|0-2|=6;
mover la y de todos los puntos a la intervalo [34,36], el costo es |0-34|+|35-35|+|184-36|=182;
mueva z de todos los puntos al intervalo -87, el costo es |-87-2| +|- 87-(-87)|+|-87-(-126)|=128; el
costo total es: 6+182+128=316.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int x[N],y[N],z[N];
int n;
ll cal(int a[]){//计算单点代价
    ll v=0;
    int low=1,high=n;
    while(low<high){
        v=v+abs(a[low++]-a[high--]);
    }
    return v;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x[i]>>y[i]>>z[i];

    }
    auto f=[](int a,int b){return a<b;};
    sort(x+1,x+n+1,f);
    sort(y+1,y+n+1,f);
    sort(z+1,z+n+1,f);
    ll res=cal(x)+cal(y)+cal(z);
    int low=1,high=n;
    while(low<high){
        //扣除直线代价空缺,0->35=0->34+34->35;184->35=284->36+36->35;
        //前面res是直线到中心,可以看成res->边界+边界->中心
        //现在扣除的是边界->中心
        res-=high-- - low++;
    
    }
    cout<<res<<endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_71356343/article/details/132410710
Recomendado
Clasificación