2351. 开关门问题
1000ms
256MB
简单
模拟法
题目描述
某校有 $N$ 间教室,且每间教室有 2 扇门,一共有 $2 \times N$ 扇门。每扇门都有编号,分别为自 $1$ 到 $2 \times N$。
开始时,所有门均为关闭状态。现在按照以下规则对门进行处理:
- 第一次,将所有门打开(即所有编号为 1 的倍数的门状态反转)。
- 第二次,将所有编号为 2 的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。
- 第三次,将所有编号为 3 的倍数的门作相反的处理。
- ……
- 第 $N$ 次,将所有编号为 $N$ 的倍数的门作相反的处理。
问第 $N$ 次处理后,有多少扇门为打开状态?
输入格式
一行,输入一个正整数 $N$ ($2 \le N \le 100$),代表教室的数量。
输出格式
输出一个整数,表示经过 $N$ 次处理后,处于打开状态的门的总数。
样例 1
输入 (Input)
2
输出 (Output)
2
样例说明
$N=2$,共有 4 扇门,初始均为关闭。
- 第一次操作后,所有门打开:`1(开), 2(开), 3(开), 4(开)`。
- 第二次操作后,反转 2 的倍数门(2 号和 4 号):`1(开), 2(关), 3(开), 4(关)`。
- 操作在第 $N=2$ 次结束,最终打开的门有 1 号和 3 号,共 2 扇。
- $2 \le N \le 100$。
- **算法提示**:
由于 $N \le 100$ 数据范围非常小,可以直接使用一个大小为 $2 \times N + 1$ 的布尔数组进行状态模拟:
1. 用 `false` 表示关闭,`true` 表示打开。
2. 外层循环 $i$ 从 1 到 $N$,代表第 $i$ 次操作。
3. 内层循环 $j$ 从 $i$ 开始,每次递增 $i$,将所有满足 $j \le 2N$ 的门的状态取反(`doors[j] = !doors[j]`)。
4. 最后统计数组中为 `true` 的元素个数。
› 输入 stdin
CtrlShiftEnter
‹ 输出 stdout
错误 stderr
操作成功