2016-04-09 77 views
0

最近我參加了用友的編程競賽。這是其中一個問題。 http://i.imgur.com/2Fg4MfO.jpgJava - Judge解決方案(RGB)的解釋

這是法官的解決方案:http://hastebin.com/unozolusiw.avrasm

這是我不確定的部分。

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

我理解的總和增加部分,N是案件的數量,這部分我不明白:

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

我知道&和< <做,但我不不明白如何檢查是否應該將其添加到組合中。

回答

0

基本上這會產生所有的二進制數(從0到2^N-1)。

如果相應的位不爲零,則選擇顏色組合。

例如,對於6 = 0110,您選擇位1和位置2(從右邊):如果我和 < j硬幣在那一點你採取相應的顏色(j)。

I = 0110針對J = 0001,0010,0100,1000

(有在顏色組合的最2^N的可能性,這就是爲什麼POW = 1個< < N.)

-

ANDing i和1 < < j意味着它們是否都有共同的1位,並且檢查零是否意味着是真的(它們有一些共同的1位)。因爲j只能有一個非零位(它在不同位置移動1),所以最多隻能有一個公共位:要選擇的顏色。

你可以試試這個代碼,看看組合:

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