Buscar distancia d en vector amb distàncies consecutives estríctament creixents X42592


Statement
 

pdf   zip   main.cc

html

Heu d’implementar una funció que rep un natural d i un vector v amb dos o més elements i que cumpleix la següent condició: la successió de distàncies entre cada dos elements consecutius de v és estrictament creixent, és a dir |v[0]−v[1]| < |v[1]−v[2]| < |v[2]−v[3]| < ⋯. Per exemple, la següent seqüència cumpleix aquesta condició:

3 2 4 8 0 -10 -22 -8 7

Fixeu-vos que la distància entre el primer i el segon element és 1, la distancia entre el segon i el tercer és 2, entre el tercer i el quart és 4, entre el quart i el cinquè és 8, entre el cinquè i el sisè és 10, entre el sisè i el setè és 12, entre el setè i el vuitè és 14, i entre el vuitè i el novè és 15. Queda clar, doncs, que la seqüència de distàncies consecutives és creixent.

En cas que hi hagi una parella d’elements consecutius a distància d, la funció ha de retornar la posició (indexant des de 0) del primer element d’aquesta parella. En cas contrari, la funció ha de retornar -1. En l’exemple anterior, amb d=12 la funció ha de retornar 5, i amb d=6 la funció ha de retornar −1. Aquesta és la capcelera:

// 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);

Els jocs de proves privats miren de comprovar que la vostra solució és de cost logarítmic.

Observació Només cal enviar el procediment demanat; el programa principal serà ignorat.

Observació

Podeu utilitzar la funció abs de cmath si voleu. Avaluació sobre 10 punts:

  • Solució lenta: 5 punts.
  • solució ràpida: 10 punts.

Entenem com a solució ràpida una que és correcta, de cost logarítmic i capaç de superar els jocs de proves públics i privats. Entenem com a solució lenta una que no és ràpida, però és correcta i capaç de superar els jocs de proves públics.

Sample session
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
Information
Author
PRO1
Language
Catalan
Other languages
English Spanish
Official solutions
C++
User solutions
C++