2016-04-09 65 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); 
      }