肝题日志【一】

一篇关于算法问题的博客,讲述了狱卒在喝醉后按照特定规则开关牢房门,导致部分囚犯逃跑的故事。通过分析得出,逃犯数量等于输入数值的平方根。博客包括题目描述、样例输入输出、代码实现和最优解决方案。

从学校回到家里做完了一道在学校思考了很久的数组问题——喝醉的狱卒

目录

题目描述

样例

        输入

        输出

代码

最优解


题目描述

    在一所监狱里有一条长长的走廊,沿着走廊排列着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));

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值