我不明白如何解决这个问题
弗拉基米尔在一场科学展览上展示了他的装置,该装置由连接在一个电路中的 N 个灯泡组成。突然,他意识到展览中展出的像他这样的装置一定很漂亮。如果一个装置从头开始连续具有一定数量(可能为零)的灯泡,这些灯泡被关闭,其余的灯泡被打开,则该装置被认为是漂亮的。例如:电路0000111很漂亮,但电路00010011则不然,其中0是灯泡关闭,1是打开。装置上的每个灯泡都可以打开或关闭。展览即将开始,弗拉基米尔需要用最少数量的灯光开/关来让他的装置变得漂亮。下面我提供了解决问题的代码,但我不明白为什么要这样编写代码的算法逻辑。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
int totalDisabled = 0;
for (char c : s.toCharArray()) {
if (c == '0') {
totalDisabled++;
}
}
int answer = totalDisabled;
int disabled = 0;
int abled = 0;
for (char c : s.toCharArray()) {
if (c == '1') {
abled++;
} else {
disabled++;
}
answer = Math.min(answer, + totalDisabled - abled);
}
}
}
如果存在一个由 0 和 1 组成的序列,并且我们位于该序列的某个位置(指针
^)不难看出 - 要获得一个漂亮的序列,其中在给定索引之后将分隔零和一,您需要:
a) 将迄今为止遇到的所有单位重置为零- 在给定代码中,该值为
abled,位置被标记#b) 设置右侧的所有零(标记为
*) - 其数量可以很容易地通过总零数totalDisabled与左侧已遇到的零数之间的差值找到disabled。因此,在计算最小值时(同时遍历所有可能的分割位置),应使用表达式