2016-04-09 9 views
0

Kürzlich ging ich zu einem Programmierwettbewerb in UF. Das war eine der Fragen. http://i.imgur.com/2Fg4MfO.jpgJava - Erklärung für Judges Lösung (RGB)

Das war die Lösung des Richters: http://hastebin.com/unozolusiw.avrasm

Dies ist der Teil über Ich bin nicht sicher.

for (int j = 0; j < N; j++) { 
       if ((i & (1 << j)) != 0) { 
        sumR += rs[j]; 
        sumG += gs[j]; 
        sumB += bs[j]; 
       } 
      } 

verstehe ich die Summe Teil hinzugefügt, und dass N die Menge der Fälle, ist dieser Teil verstehe ich nicht:

if ((i & (1 << j)) != 0) 

Ich weiß, was & und < < tun, aber ich don Ich verstehe nicht, wie das überprüft, ob Sie das zu den Kombinationen hinzufügen sollten.

Antwort

0

Im Wesentlichen erzeugt dies alle Binärzahlen (von 0 bis 2^N-1).

Wenn die entsprechenden Bits ungleich Null sind, wählen Sie die Farben aus, um eine Kombination zu bilden.

beispielsweise für 6 = 0110 Bits wählen Sie 1 und 2 (von rechts): if i und < j Coinside in diesem Bit in der entsprechenden Farbe (j) nehmen.

i = 0110 gegen j = 0001, 0010, 0100, 1000

(Es gibt höchstens 2^N Möglichkeiten der Kombinationen von Farben Deshalb pow = 1 < < N.)

-

ANDing i und 1 < < j bedeutet, wenn beide gemeinsame 1-Bits haben und die Überprüfung gegen Null bedeutet, dass das wahr ist (sie haben einige gemeinsame 1-Bits); seit 1 < < j kann nur ein Bit ungleich null (es ist 1 in verschiedenen Positionen verschoben) i & (1 < < j) kann höchstens ein gemeinsames Bit haben: die Farbe zu wählen.

können Sie diesen Code versuchen, die Kombinationen zu sehen:

 int pow = 1 << 5; 
     boolean works = false; 
     for (int i = 0; i < pow; i++) { 
      int sumR = 0; 
      int sumG = 0; 
      int sumB = 0; 

      for (int j = 0; j < 5; j++) { 
      if((i & (1<<j)) !=0) System.out.println(i+" 22 "+j); 
      System.out.println(i+" "+j); 
      }