📜  门|门 CS 1999 |问题 25(1)

📅  最后修改于: 2023-12-03 15:42:21.136000             🧑  作者: Mango

问题 25: 门|门 CS 1999

题目描述

有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)。