Programación del robot Xiao I
La relación adyacente de los robots restantes cambiará, por lo que se volverá a calcular el tiempo de colisión y se repetirán los pasos anteriores hasta que no se produzca ninguna colisión.
El código C es el siguiente:
# include ltbits/stdc. h gt//Archivo de encabezado general C
Usar espacio de nombres std
Usar tri = tuple ltdouble, int, int gt // Tiempo de colisión y número de robot
int main() {
int n, k;
CIN gt; gtn;
k = n // El número de robots restantes p; >
int x[n 1], v[n 1]; //Posición inicial y velocidad
for(int I = 1; i lt= n; i) //Número desde 1 inicio .
CIN gt; gtx[I] gt; gt five[one];
int crash[n 1] // Marca el robot que chocó.
memset(crash, 0, sizeof(crash));
Cola de prioridad lttri, vector lttri gt, mayor lttri gt gtpq //Pequeño montón raíz
while(k gt; = 2) {//Al menos dos robots pueden chocar.
int I = 1;
mientras(i ltn amp amp crash[I]) I
mientras(i ltn) {
int j = I 1; //Calcula el tiempo de colisión con el robot de la derecha.
mientras(j lt; = n amp ampcrash[j]) j
if(j gt; n) desconectar
long d = x [ j]-x[I];
if(v[I] lt; = 0 amp ampv[j] lt; V[i] // j golpea I
| | (v[I] gt; 0 amp ampv[j] lt; v[I]){//Presiono j
delta largo _ v = v[I]-v[j] ;
Doble t = d * 1.0/delta _ v;
pq .posición de pistola (t, I, j
}
I = j;
}
if(pq . vacío())break; //No chocan robots
Y (!pq .empty( )) {
auto t = pq . top();
pq .
int ii = obtener lt1 gt; jj = get lt2 gt(t);
If (! Crash ⅱ amp; amp! Crash[jj]) {//Solo pueden colisionar mientras todavía están allí.
Crash[ii] = crash[jj]= 1
k-=
}
}
}
cout lt ltk lt lt"\n";
for(int I = 1; i lt= n; i) {
if(!crash[i])
cout lt lt i lt lt" ";
}
cout lt lt"\n"; p> p>
Devuelve 0;
}
El caso de prueba dado ha pasado, pero se necesitan más casos de prueba para verificar si es correcto. Espero adoptarlos~