2016-08-01 27 views
1

Also habe ich versucht, ein Problem zu lösen, bei dem Sie feststellen, ob zwei Kängurus irgendwann auf dem gleichen Punkt landen die gleiche Zeit gegeben, dass man an der Position x1 beginnt und reist Entfernung v1 pro Hop, und die anderen x2 und v2 für die Messung derselben.Wo ist mein Fehler bei der Bestimmung, ob es ein int N gibt, also x1 + v1 * N = x2 + v2 * N

Beispiel:

Eingang 0 3 4 2 bedeutet x1=0, v1=3, x2=4, v2=2. Sie werden schließlich auf dem gleichen Punkt landen, weil ihre Entfernungen von dem Start und nach jedem Sprung sind wie

0 -> 3 -> 6 -> 9 -> 12 
4 -> 6 -> 8 -> 10 -> 12 

Meine Lösung einiger Testfälle versagt und ich frage mich, wo der Fehler in der Logik meines OS (1) Lösung:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
class Solution 
{ 
    static void Main(String[] args) { 
     string[] tokens_x1 = Console.ReadLine().Split(' '); 
     int x1 = Convert.ToInt32(tokens_x1[0]); 
     int v1 = Convert.ToInt32(tokens_x1[1]); 
     int x2 = Convert.ToInt32(tokens_x1[2]); 
     int v2 = Convert.ToInt32(tokens_x1[3]); 
     // What needs to be determined is whether there exists an N such that 
     // x1 + v1 * N = x2 + v2 * N 
     // or, equivalenly, 
     // (x1 - x2) = (v2 - v1) * N 
     double ndouble = ((double)x1 - (double)x2)/((double)v2 - (double)v1); 
     Console.WriteLine(ndouble == (int)ndouble ? "YES" : "NO"); 
    } 
} 
+3

Vorsicht für durch Nullen – samgak

Antwort

3

Es gibt zwei Probleme:

  1. floating point numbers führen zu Rundungs ​​erros
  2. Division durch zer o (wie @samgak erwähnt)

So Ihre Methode wird dies:

return (x1 == x2) || 
    (((x1 < x2 && v1 > v2) || (x2 < x1 && v2 > v1)) && (x1 - x2) % (v1 - v2) == 0); 

Wenn x1 die gleiche wie x2 ist, dann müssen wir nicht weiter suchen. Dies ist der einzige Fall, in dem v1 == v2 und die Kängurus sich treffen. Die Überprüfung, ob die erste Nummer durch die Sekunde teilbar ist, wird mit einem Modulo und ganzen Zahlen gemacht, so dass es keine Rundungsfehler geben kann. Bevor wir den Modulo anwenden, stellen wir sicher, dass sich die Kängurus aufeinander zu bewegen und nicht voneinander weg sind (1% -1 == 0, aber keine Lösung, wie @zerkms hervorhebt).

+0

'(x1 - x2)% (v1 - v2) == 0 'sicher falsch ist, da es sich um eine nicht übernimmt Anmelden in das Konto. – zerkms

+0

Ich schaute nach oben (wollte zwei Fälle mit v1 maraca

+2

Nun, es spielt eine Rolle - die gelieferte Lösung ist anfällig für Fehlalarme. ZB: '1 0 3 2' würde" wahr "zurückgeben, während es definitiv nicht ist. – zerkms

1

Hier ist eine C-Lösung auf diese Kluft

int main(){ 
    int x1; 
    int v1; 
    int x2; 
    int v2; 
    scanf("%d %d %d %d",&x1,&v1,&x2,&v2); 
    int x = x1-x2,v = v2-v1; 
    if((v==0 && x==0)||(x!=0 && v!=0 && x%v==0 && (x*v>=0))) 
     printf("YES\n"); 
    else 
     printf("NO\n"); 
    return 0; 
}