Implementad una función que recibe un natural d y un vector v con dos o más elementos y que cumple la siguiente condición: la sucesión de distancias entre cada dos elementos consecutivos de v es estrictamente creciente, es decir |v[0]−v[1]| < |v[1]−v[2]| < |v[2]−v[3]| < ⋯. Por ejemplo, la siguiente secuencia cumple esta condición:
3 2 4 8 0 -10 -22 -8 7
Fijaos en que la distancia entre el primer y segundo elemento es 1, la distancia entre el segundo y tercero es 2, enter el tercero y cuarto es 4, entre el cuarto y quinto es 8, entre el quinto y sexto es 10, entre el sexto y el séptimo es 12, entre el séptimo y el octavo es 14, y entre el octavo y el noveno es 15. Queda claro, entonces, que la secuencia de distancias consecutivas es creciente.
En caso de que haya una pareja de elementos consecutivos a distancia d, la función tiene que devolver la posición (indexando desde 0) del primer elemento de esta pareja. En caso contrario, la función debe devolver -1. En el ejemplo anterior, con d=12 la función tiene que devolver 5, y con d=6 la función tiene que devolver −1. Esta es la cabecera:
// Pre: Let n be v.size(). n>=2 and d>=0 and |v[0]-v[1]| < |v[1]-v[2]| < ... < |v[n-2]-v[n-1]| // Post: If there exists i in {0..n-2} holding |v[i]-v[i+1]| = d, then the function returns this i. // Otherwise, it returns -1. int findDistance(int d, const vector<int> &v);
Los juegos de prueba privados tratan de compruebar que vuestra solución es de coste logarítmico.
Observación Sólo tenéis que enviar el procedimiento requerido; el programa principal será ignorado.
Observación
Se puede utilizar la función abs de cmath. Evaluación sobre 10 puntos:
Entendemos como solución rápida una que es correcta, de coste logarítmico y capaz de superar los juegos de prueba 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.
findDistance(2, [7, 8, 10, 5]) = 1 findDistance(1, [8, 7, 10]) = 0 findDistance(12, [7, 9, 16, 8, -4, 9, 25]) = 3 findDistance(11, [8, 12, 19, 30, 46, 27]) = 2 findDistance(36, [1, 5, 10, 1, -9, -21, -8, -24, -41, -63, -38, -64, -91, -121, -156, -120, -80, -124]) = 14 findDistance(32, [2, 1, -1, -7, 2, -9, -25, -8, -29, -6, 20, 49, 18, 50, 16, 55]) = 12 findDistance(7, [10, 11, 14, 18, 25, 34, 47, 33, 15, 38, 13, -17]) = 3 findDistance(40, [9, 4, -6, -20, -35, -52, -34, -12, -38, -11, 17, -16, -54, -14, 28, 71, 116, 69, 120]) = 12 findDistance(35, [2, 1, 5, 13, 1, 15, -4, -28, 0, 32]) = -1 findDistance(69, [9, 6, 12, 1, 13, 26, 42, 63, 41, 68, 36, 1, -37, 2, -41, 5, -46, 7]) = -1 findDistance(0, [1, 2, 4, 1, -4, -11, -19, -29, -43, -60, -82, -106, -135]) = -1 findDistance(27, [4, 7, 0, -8, 5, 23, 0]) = -1 findDistance(2, [1, 3, -4, -12]) = 0 findDistance(13, [7, 10, 2, -9, -24, -44, -22, -47, -20, 11, -22, 16, 56, 11]) = -1 findDistance(11, [9, 11, 5, -6]) = 2 findDistance(5, [2, 0, -5, -11, -4, -16, -31, -50, -70, -91, -68, -43, -69, -100, -64, -26, -65, -107, -60, -12]) = 1 findDistance(2, [4, 6, -1, -11, -23, -37]) = 0 findDistance(22, [10, 10, 6, -2, 10, 26, 46, 21, 48, 16, -18, -55, -17, 25, 70, 118]) = -1 findDistance(5, [6, 3]) = -1 findDistance(41, [5, 5, 1, 6, -1, -13, 4, 26, 0, 27, 57, 22, 58, 17, -25, 22, 74, 21, 78]) = 12