Java - Judge解决方案(RGB)的解释

时间:2016-04-09 02:00:29

标签: java combinations rgb

最近我参加了UF的编程比赛。这是其中一个问题。 http://i.imgur.com/2Fg4MfO.jpg

这是法官的解决方案: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)

我知道什么&amp;和&lt;&lt;但是,我不明白如果你应该将它添加到组合中,如何检查。

1 个答案:

答案 0 :(得分:0)

本质上,这会生成所有二进制数(从0到2 ^ N-1)。

如果相应的位非零,则选择颜色以形成组合。

例如,对于6 = 0110,您选择位1和2(从右侧):如果我和 1&lt;&lt;在那个位置j coinide你采取相应的颜色(j)。

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

(最多有2 ^ N种颜色组合的可能性,这就是为什么pow = 1&lt;&lt; N.)

-

ANDing i和1&lt;&lt; j表示如果它们都有任何公共1位,则检查零意味着它是真的(它们有一些共同的1位);因为1&lt;&lt; j只能有一个非零位(它在不同位置移位1)i&amp; (1&lt;&lt; j)可以具有至多一个共同位:要选择的颜色。

您可以尝试使用此代码查看组合:

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