【发布时间】:2016-03-08 05:16:05
【问题描述】:
我正在尝试了解here 给出的问题及其解决方案:
问题说明:
N个灯泡用电线连接。每个灯泡都有一个与之关联的开关,但是由于接线错误,一个开关也会改变当前灯泡右侧所有灯泡的状态。给定所有灯泡的初始状态,找出打开所有灯泡所需按下的最少开关数。您可以多次按下同一个开关。
注意:0代表灯泡关闭,1代表灯泡打开。
Example:
Input : [0 1 0 1]
Return : 4
Explanation :
press switch 0 : [1 0 1 0]
press switch 1 : [1 1 0 1]
press switch 2 : [1 1 1 0]
press switch 3 : [1 1 1 1]
给出的答案之一是:
int solve(int A[], int N) {
int state= 0, ans = 0;
for (int i = 0; i < N;i++) {
if (A[i] == state) {
ans++;
state = 1 - state;
}
}
return ans;
}
我似乎无法理解 if 语句是如何做正确的事情的。
【问题讨论】:
-
请附上描述问题的简明图片的文字描述。
-
实际上翻转所有灯泡的状态会非常昂贵。相反,我们只是假装灯泡的状态被翻转了。如果假装灯泡关闭,则真正的灯泡打开,反之亦然。如果我们想假装翻转一堆假装灯泡,我们最终会假装假装,这让我们回到现实。
state记录我们是否在伪装。
标签: java algorithm bit-manipulation