从学校回到家里做完了一道在学校思考了很久的数组问题——喝醉的狱卒
目录
输出
题目描述
在一所监狱里有一条长长的走廊,沿着走廊排列着n个牢房。每个牢房有一个囚犯,而且房门都是锁着的。
一天晚上,狱卒觉得很无聊,于是他决定玩一个游戏。第一轮,他喝了一口威士忌,然后沿着走廊,将所有牢房的门打开。第二轮,他又喝了一口威士忌,然后又沿着走廊,将所有编号为2的倍数的牢房锁上。第三轮,他再喝一口威士忌,再沿着走廊,视察所有编号为3的倍数的牢房。如果牢房是锁着的,他就把它打开;若果牢房是开着的,他就把他锁上。他如此玩了n轮后,喝下最后一口威士忌,醉倒了。
当他醉倒后,一些犯人发现他们的牢房开着就立刻逃跑了。给出若干个牢房的数目,请你确认各有多少犯人逃出了监狱。
程序一共会执行 m 次。
样例
输入
2 5 100
输出
2 10
代码
#include <bits/stdc++.h>
using namespace std;
int f[10010], m, n, i, j, ans;
int main()
{
cin >> m;
while (m--)
{
cin >> n;
for(i=1; i<=n; i++) f[i] = 0;
for(i=1; i<=n; i++)
{
for(j=i; j<=n; j+=i) f[j] = 1-f[j];
}
ans = f[1];
for(i=2; i<=n; i++) ans += f[i];
cout << ans << endl;
}
return 0;
}
最优解
其实这道题仔细研究的话是可以发现这样一个公式:输出的值为输入值的开方
即
cin >> n;
cout << int(sqrt(n));
一篇关于算法问题的博客,讲述了狱卒在喝醉后按照特定规则开关牢房门,导致部分囚犯逃跑的故事。通过分析得出,逃犯数量等于输入数值的平方根。博客包括题目描述、样例输入输出、代码实现和最优解决方案。

641

被折叠的 条评论
为什么被折叠?



