Centro de masas de partículas que se mueven a velocidad constante X30485


Statement
 

pdf   zip

html

Preliminares

En este ejercicio implementaremos un programa que escribe números reales por la salida. Debido a problemas de formato y eficiencia de cin y cout cuando trabajan con números reales, conviene hacer algunas cosas que mencionamos a continuación.

Al principio de la función main debéis poner estas instrucciones:

 ios::sync_with_stdio(false);
 cin.tie(0);    
 cout.setf(ios::fixed);
 cout.precision(5);

Para escribir reales por la salida, conviene que incluyáis y uséis esta función:

void printDouble(double d)
{
 if (abs(d) < 1e-7)
  cout << 0.0;
 else
  cout << d;
}

Por último, y no por ello menos importante, no uséis endl para escribir saltos de linea. Usad ’\n’ en su lugar. Es decir:

 // This line has been replaced with next one:
 // cout << endl;
 cout << '\n';

Ejercicio

Nota: En este ejercicio hablaremos de posiciones de partículas en un sistema 3-dimensional, y de sus velocidades y masas. El sistema de referencia y unidades no es demasiado relevante, siempre y cuando se escoja uno de más o menos estandar y razonable. Por si alguien siente la necesidad, os podéis imaginar que hablamos de metros, segundos, metros por segundo y kilogramos.

Tenemos como entrada la posición, velocidad y masa de n partículas (p1,v1,m1),…,(pn,vn,mn). En particular, la primera partícula se encuentra en posición p1 en tiempo 0, se desplaza a velocidad constante v1, y tiene masa m1. Se supone que todo se expresa en un sistema cartesiano de coordenadas en tres dimensiones.

También tenemos como entrada k valores de tiempo t1,…,tk.

Tendremos que determinar el centro de masas de las n partículas después de t1 unidades de tiempo, después de t1+t2 unidades de tiempo, después de t1+t2+t3, …, después de t1+⋯+tk unitades de tiempo.

Es obligatorio usar coherentemente las siguientes declaraciones de tipos, y implementar y utilizar coherentemente las siguientes funciones. En caso contrario, se invalidará la entrega. Podéis declarar más tipos de datos y implementar más funciones si queréis, y de hecho es recomendable hacerlo.

struct Point {
 double x, y, z;
};

struct Particle {
 Point p,v;
 double m;
};

// Pre:
// Post: returns the sum of p1 and p2.
Point sum(Point p1, Point p2)
{
 //...
}

// Pre:
// Post: returns a times p.
Point mul(double a, Point p)
{
 //...
}

Nota: Os recomendamos empezar haciendo una implementación sencilla con el fin de superar los juegos de pruebas públicos, y tratar después de optimizarla con el fin de superar también los juegos de pruebas privados.

Entrada

La entrada tiene varios casos. Cada caso comienza con dos naturales positivos n, k en una primera linea. Después vienen n lineas, cada una describiendo la posición (tres enteros), velocidad (tres enteros) y masa (un natural positivo) de una partícula. Finalmente vienen k lineas, cada una con un natural positivo que representa un tiempo transcurrido.

Salida

Para cada caso, primero se han de escribir k lineas, donde la i-ésima linea continene el centro de masas (tres reales redondeados a 5 dígitos después del punto decimal) de todas las partículas después de la suma de los i primeros tiempos. Finalmente, se han de escribir n lineas, con las posiciones (tres reales redondeados a 5 dígitos después del punto decimal) de las partículas después de la suma de todos los instantes de tiempo. Cada caso viene seguido de una linea en blanco.

Observación

Evaluación sobre 10 puntos:

  • Solución lenta: 5 puntos.
  • Solución rápida: 10 puntos.

Entendemos como solución rápida una que es correcta, de coste lineal y capaz de superar los juegos de pruebas públicos y privados. Entendemos como solución lenta una que no es rápida, pero es correcta y capaz de superar los juegos de pruebas públicos.

Public test cases
  • Input

    2 2
    0 0 0 0 0 1 1
    1 0 0 0 0 1 1
    1
    1
    2 2
    0 0 0 1 0 0 1
    1 0 0 1 0 0 1
    1
    1
    2 2
    0 0 0 1 0 0 1
    1 0 0 0 0 1 1
    1
    1

    Output

    0.50000 0.00000 1.00000
    0.50000 0.00000 2.00000
    0.00000 0.00000 2.00000
    1.00000 0.00000 2.00000
    
    1.50000 0.00000 0.00000
    2.50000 0.00000 0.00000
    2.00000 0.00000 0.00000
    3.00000 0.00000 0.00000
    
    1.00000 0.00000 0.50000
    1.50000 0.00000 1.00000
    2.00000 0.00000 0.00000
    1.00000 0.00000 2.00000
    
    
  • Input

    4 2
    1 -3 -4 -1 -5 1 5
    -4 3 2 0 -2 2 2
    4 5 -3 -5 5 3 3
    -5 -1 1 -5 5 -2 1
    5
    3
    3 4
    2 4 2 3 -3 5 5
    5 -1 -4 -5 5 -1 5
    2 1 3 1 -3 -3 2
    4
    3
    1
    2
    2 1
    -1 -1 -2 1 4 5 5
    -1 -4 -5 5 4 -1 5
    3
    5 5
    1 4 2 -4 -1 4 4
    4 -3 5 -2 2 1 1
    4 3 4 -1 0 4 5
    4 3 -2 3 2 0 2
    -1 2 2 3 0 -4 2
    1
    2
    2
    1
    5
    5 5
    -1 -3 -1 -2 5 -2 2
    -3 5 3 5 0 -5 4
    5 1 5 -2 -5 2 4
    0 1 4 5 -1 4 4
    -2 2 -3 3 2 -1 4
    1
    2
    2
    2
    1
    5 4
    3 3 -5 2 -2 4 5
    -4 0 3 -1 -5 1 2
    -3 -3 4 1 2 4 3
    -2 -2 3 3 3 4 1
    -5 3 3 3 -1 1 4
    2
    4
    5
    2
    5 4
    -3 1 -2 -1 3 1 4
    -4 -5 5 -5 -1 -5 5
    5 2 2 -4 2 -3 1
    -3 1 -3 -1 -4 0 5
    3 5 -1 3 -2 1 5
    4
    2
    3
    4
    5 4
    -4 -4 -4 2 -5 3 1
    -4 -3 -1 3 -1 5 2
    3 4 -2 -3 1 -5 3
    -3 -1 -5 -1 -2 3 2
    -2 2 0 -3 4 -1 4
    2
    2
    1
    4
    5 1
    -1 0 -1 -3 -4 -5 4
    -4 2 -1 1 4 1 5
    -5 4 -4 0 -4 2 3
    -3 -2 -3 -4 5 -4 4
    1 -4 1 -5 -1 3 3
    2
    2 4
    0 -3 -1 4 4 5 5
    4 3 -3 -4 2 2 3
    1
    5
    4
    1
    5 3
    5 -2 3 -2 -4 -3 3
    -3 0 1 -1 5 2 1
    4 0 0 5 -3 -3 1
    -4 2 2 4 1 -1 5
    -4 -4 -4 -5 0 4 1
    1
    3
    5
    5 4
    1 3 -2 -3 -2 5 5
    3 4 2 3 2 2 5
    -2 0 4 0 5 5 4
    -5 4 5 4 5 -2 4
    5 5 -4 -2 2 -3 2
    4
    5
    1
    2
    4 3
    -1 2 5 4 3 -3 4
    -2 -4 -1 3 5 -5 4
    2 -5 5 -1 3 2 1
    -5 -3 0 -2 -5 2 3
    5
    3
    5
    4 5
    -5 1 4 -2 -5 5 4
    -2 0 -3 -2 -4 4 1
    4 -5 4 1 -2 2 5
    1 5 1 -2 4 -4 5
    5
    3
    4
    3
    1
    4 5
    -1 -3 -4 0 2 -4 2
    1 5 3 0 3 -1 2
    -5 -4 -1 2 4 5 3
    2 4 -1 0 3 -5 4
    1
    4
    3
    2
    1
    2 2
    5 -4 -2 -2 4 4 1
    2 -2 -1 0 -3 1 3
    3
    3
    2 5
    -5 4 4 3 3 3 5
    5 1 5 -4 0 0 3
    4
    4
    2
    1
    5
    2 3
    1 -5 -5 3 -1 4 3
    3 -2 -5 3 -3 4 3
    5
    4
    3
    4 3
    3 1 -1 -4 0 4 4
    2 5 -5 -3 0 2 4
    -2 -3 2 -4 2 -3 4
    2 3 0 -2 -5 -3 3
    1
    3
    2
    3 1
    -5 1 0 2 -4 5 2
    -4 -5 2 1 -3 5 1
    2 -4 -2 2 -1 -5 2
    5
    

    Output

    -11.00000 -3.63636 5.09091
    -17.81818 -6.09091 9.45455
    -7.00000 -43.00000 4.00000
    -4.00000 -13.00000 18.00000
    -36.00000 45.00000 21.00000
    -45.00000 39.00000 -15.00000
    
    0.58333 2.75000 4.33333
    -1.41667 3.75000 7.83333
    -2.08333 4.08333 9.00000
    -3.41667 4.75000 11.33333
    32.00000 -26.00000 52.00000
    -45.00000 49.00000 -14.00000
    12.00000 -29.00000 -27.00000
    
    8.00000 9.50000 2.50000
    2.00000 11.00000 13.00000
    14.00000 8.00000 -8.00000
    
    1.64286 2.85714 4.42857
    0.07143 3.14286 8.57143
    -1.50000 3.42857 12.71429
    -2.28571 3.57143 14.78571
    -6.21429 4.28571 25.14286
    -43.00000 -7.00000 46.00000
    -18.00000 19.00000 16.00000
    -7.00000 3.00000 48.00000
    37.00000 25.00000 -2.00000
    32.00000 2.00000 -42.00000
    
    2.11111 1.33333 1.66667
    6.55556 0.66667 1.22222
    11.00000 0.00000 0.77778
    15.44444 -0.66667 0.33333
    17.66667 -1.00000 0.11111
    -17.00000 37.00000 -17.00000
    37.00000 5.00000 -37.00000
    -11.00000 -39.00000 21.00000
    40.00000 -7.00000 36.00000
    22.00000 18.00000 -11.00000
    
    1.86667 -0.93333 6.13333
    8.80000 -4.93333 17.33333
    17.46667 -9.93333 31.33333
    20.93333 -11.93333 36.93333
    29.00000 -23.00000 47.00000
    -17.00000 -65.00000 16.00000
    10.00000 23.00000 56.00000
    37.00000 37.00000 55.00000
    34.00000 -10.00000 16.00000
    
    -5.95000 -3.65000 -3.85000
    -8.25000 -5.75000 -5.75000
    -11.70000 -8.90000 -8.60000
    -16.30000 -13.10000 -12.40000
    -16.00000 40.00000 11.00000
    -69.00000 -18.00000 -60.00000
    -47.00000 28.00000 -37.00000
    -16.00000 -51.00000 -3.00000
    42.00000 -21.00000 12.00000
    
    -3.91667 2.00000 -1.83333
    -6.41667 3.33333 -1.83333
    -7.66667 4.00000 -1.83333
    -12.66667 6.66667 -1.83333
    14.00000 -49.00000 23.00000
    23.00000 -12.00000 44.00000
    -24.00000 13.00000 -47.00000
    -12.00000 -19.00000 22.00000
    -29.00000 38.00000 -9.00000
    
    -6.52632 1.05263 -3.26316
    -7.00000 -8.00000 -11.00000
    -2.00000 10.00000 1.00000
    -5.00000 -4.00000 0.00000
    -11.00000 8.00000 -11.00000
    -9.00000 -6.00000 7.00000
    
    2.50000 2.50000 2.12500
    7.50000 18.75000 21.50000
    11.50000 31.75000 37.00000
    12.50000 35.00000 40.87500
    44.00000 41.00000 54.00000
    -40.00000 25.00000 19.00000
    
    0.45455 -0.45455 0.45455
    4.00000 -1.81818 -2.54545
    9.90909 -4.09091 -7.54545
    -13.00000 -38.00000 -24.00000
    -12.00000 45.00000 19.00000
    49.00000 -27.00000 -27.00000
    32.00000 11.00000 -7.00000
    -49.00000 -4.00000 32.00000
    
    2.50000 11.85000 9.60000
    5.50000 22.85000 19.85000
    6.10000 25.05000 21.90000
    7.30000 29.45000 26.00000
    -35.00000 -21.00000 58.00000
    39.00000 28.00000 26.00000
    -2.00000 60.00000 64.00000
    43.00000 64.00000 -19.00000
    -19.00000 29.00000 -40.00000
    
    6.66667 6.50000 -8.25000
    11.91667 11.50000 -14.25000
    20.66667 19.83333 -24.25000
    51.00000 41.00000 -34.00000
    37.00000 61.00000 -66.00000
    -11.00000 34.00000 31.00000
    -31.00000 -68.00000 26.00000
    
    -4.80000 -4.40000 7.20000
    -7.80000 -7.20000 10.00000
    -11.80000 -10.93333 13.73333
    -14.80000 -13.73333 16.53333
    -15.80000 -14.66667 17.46667
    -37.00000 -79.00000 84.00000
    -34.00000 -64.00000 61.00000
    20.00000 -37.00000 36.00000
    -31.00000 69.00000 -63.00000
    
    -0.09091 3.81818 -2.18182
    2.09091 16.18182 -7.63636
    3.72727 25.45455 -11.72727
    4.81818 31.63636 -14.45455
    5.36364 34.72727 -15.81818
    -1.00000 19.00000 -48.00000
    1.00000 38.00000 -8.00000
    17.00000 40.00000 54.00000
    2.00000 37.00000 -56.00000
    
    1.25000 -6.25000 4.00000
    -0.25000 -10.00000 9.25000
    -7.00000 20.00000 22.00000
    2.00000 -20.00000 5.00000
    
    0.25000 10.37500 11.87500
    1.75000 17.87500 19.37500
    2.50000 21.62500 23.12500
    2.87500 23.50000 25.00000
    4.75000 32.87500 34.37500
    43.00000 52.00000 52.00000
    -59.00000 1.00000 5.00000
    
    17.00000 -13.50000 15.00000
    29.00000 -21.50000 31.00000
    38.00000 -27.50000 43.00000
    37.00000 -17.00000 43.00000
    39.00000 -38.00000 43.00000
    
    -2.13333 0.93333 -0.86667
    -12.13333 -0.46667 -0.26667
    -18.80000 -1.40000 0.13333
    -21.00000 1.00000 23.00000
    -16.00000 5.00000 7.00000
    -26.00000 9.00000 -16.00000
    -10.00000 -27.00000 -18.00000
    
    7.00000 -15.20000 4.60000
    5.00000 -19.00000 25.00000
    1.00000 -20.00000 27.00000
    12.00000 -9.00000 -27.00000
    
    
  • Information
    Author
    PRO1
    Language
    Spanish
    Translator
    Original language
    Catalan
    Other languages
    Catalan English
    Official solutions
    C++
    User solutions
    C++