📅  最后修改于: 2023-12-03 15:42:21.136000             🧑  作者: Mango
有n个门,编号为1至n,现在要求按照以下方式依次打开这些门:
第一次前往每个编号为奇数的门,并将其打开。
第二次前往每个编号为3的倍数的门,并将其关闭。
第三次前往每个编号为4的倍数的门,如果门是关闭的,则打开它;否则,关闭它。
第四次前往每个编号为5的倍数的门,并将其状态取反(即如果门是打开的,则关闭它;否则,打开它)。
依照上述方式操作后,问最后有多少扇门是开着的。
第一行输入一个整数n,表示门的数量。
输出一个整数,表示最后开着的门的数量。
1<=n<=1000
按照题目中的要求操作即可。首先初始化n个门的状态全部为关闭,然后按照规则分别进行操作,最后输出剩下开着的门的数量。
void solve()
{
int n;
scanf("%d", &n);
vector<int> doors(n);
for (int i = 0; i < n; i ++ ) doors[i] = 0;
for (int i = 1; i <= n; i += 2) doors[i - 1] = 1;
for (int i = 3; i <= n; i += 3) doors[i - 1] = !doors[i - 1];
for (int i = 4; i <= n; i += 4)
if (doors[i - 1]) doors[i - 1] = 0;
else doors[i - 1] = 1;
for (int i = 5; i <= n; i += 5) doors[i - 1] = !doors[i - 1];
int res = 0;
for (int i = 0; i < n; i ++ ) res += doors[i];
printf("%d\n", res);
}
注:本程序的时间复杂度为O(n)。