HDU 1218 THE DRUNK JAILER【类开灯问题】

THE DRUNK JAILER

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 27268   Accepted: 16933

Description

A certain prison contains a long hall of n cells, each right next to each other. Each cell has a prisoner in it, and each cell is locked.

One night, the jailer gets bored and decides to play a game. For round 1 of the game, he takes a drink of whiskey,and then runs down the hall unlocking each cell. For round 2, he takes a drink of whiskey, and then runs down the

hall locking every other cell (cells 2, 4, 6, ?). For round 3, he takes a drink of whiskey, and then runs down the hall. He visits every third cell (cells 3, 6, 9, ?). If the cell is locked, he unlocks it; if it is unlocked, he locks it. He

repeats this for n rounds, takes a final drink, and passes out.

Some number of prisoners, possibly zero, realizes that their cells are unlocked and the jailer is incapacitated. They immediately escape.

Given the number of cells, determine how many prisoners escape jail.

Input

The first line of input contains a single positive integer. This is the number of lines that follow. Each of the following lines contains a single integer between 5 and 100, inclusive, which is the number of cells n.

Output

For each line, you must print out the number of prisoners that escape when the prison has n cells.

Sample Input

2
5
100

Sample Output

2
10

Source

Greater New York 2002

原题链接:http://poj.org/problem?id=1218

题意:输入n,n为5-100间的一个数,代表有多少间牢房。刚开始所有房间打开,第1轮2的倍数的房间门翻转(打开的关上,关上的打开),第2轮3的倍数,第3轮4的倍数,......,第n-1轮n的倍数。求最后有几间牢房门是打开的。

和经典的开灯问题差不多,数据不大,可以直接模拟,但也有好方法。

AC代码1:暴力模拟:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
    bool a[105];
    int T,n;
    //freopen("data/1218.txt","r",stdin);
    cin>>T;
    while(T--)
    {
        cin>>n;
        memset(a,true,sizeof(a));
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(j%i==0)
                    a[j]=!a[j];
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++)
            if(a[i])
                ans++;
        cout<<ans<<endl;
    }
    return 0;
}

AC代码2:

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
    int T,n;
    //freopen("data/1218.txt","r",stdin);
    cin>>T;
    while(T--)
    {
        cin>>n;
        int ans=0;
        for(int i=1;i*i<=n;i++)
            ans++;
        cout<<ans<<endl;
    }
    return 0;
}

AC代码3:大牛代码

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
    int T,n;
    //freopen("data/1218.txt","r",stdin);
    cin>>T;
    while(T--)
    {
        cin>>n;
        int ans=(int)sqrt(n*1.0);
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-08-23 20:43:33

HDU 1218 THE DRUNK JAILER【类开灯问题】的相关文章

[ACM] POJ 1218 THE DRUNK JAILER (关灯问题)

THE DRUNK JAILER Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23246   Accepted: 14641 Description A certain prison contains a long hall of n cells, each right next to each other. Each cell has a prisoner in it, and each cell is locked

hdu 1337 The Drunk Jailer

http://acm.hdu.edu.cn/showproblem.php?pid=1337 1 #include <cstdio> 2 #include <cstring> 3 #define maxn 200 4 using namespace std; 5 int main() 6 { 7 int t; 8 int a[maxn]; 9 scanf("%d",&t); 10 int n; 11 while(t--) 12 { 13 scanf(&q

开灯问题 —— POJ 1218 THE DRUNK JAILER

对应POJ 题目:点击打开链接 THE DRUNK JAILER Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24831   Accepted: 15569 Description A certain prison contains a long hall of n cells, each right next to each other. Each cell has a prisoner in it, and eac

poj 1218 THE DRUNK JAILER【水题】

THE DRUNK JAILER Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25124   Accepted: 15767 Description A certain prison contains a long hall of n cells, each right next to each other. Each cell has a prisoner in it, and each cell is locked

POJ 1218 THE DRUNK JAILER

开关问题,有n个灯,分别由n个开关控制,拨一下开关则可以改变灯的状态(开->关 关->开).初始状态灯都是关着的,先把每个开关都拨一下,然后拨一下2的倍数的开关,接着3的倍数,直到n的倍数,问最后有多少灯是开着的. #include <iostream> #include <cstring> using namespace std; int main() { int n; cin>>n; while(n--) { int t, a[110], k; mems

n个灯,k个人的开灯问题java实现

1.问题描述 有n个灯,编号为1-n.第一个人把所以灯打开,第二个人按下 所有编号为2的倍数的开关,第三个人按下3的倍数的开关,依次类推, 一共有k个人,问最后有哪些灯开着? 样例输入: 7 3 样例输出: 1 5 6 7 2.实现代码 /** * */ package com.sunny.www.interview; /** * n个灯,k个人的开灯问题 * 灯类 * @author sunny */ public class Lamp { /** * 灯的状态(1:打开:0:关闭) */ p

9509 开灯(dfs)

9509 开灯 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC Description 有16的开关分别控制16盏灯,开关排列成4*4的矩形,这些开关有这样的关系: 你改变其中一个开关的状态,与其同行和同列的开关的状态也跟着改变.先给出一个这些开关的初始状态,要求将所有的开关都打开,让所有的灯都亮起来,要求按下开关的次数最少. 输入格式 第一行输入一个整数t,表示有多少个case,每个case之间有一空行,每个case输入一

9509 开灯

9509 开灯 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC Description 有16的开关分别控制16盏灯,开关排列成4*4的矩形,这些开关有这样的关系: 你改变其中一个开关的状态,与其同行和同列的开关的状态也跟着改变.先给出一个这些开关的初始状态,要求将所有的开关都打开,让所有的灯都亮起来,要求按下开关的次数最少. 输入格式 第一行输入一个整数t,表示有多少个case,每个case之间有一空行,每个case输入一

开灯问题

有n盏灯,编号1-n.第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依次类推.一共有k个人,问最后由哪些灯开着? 输入n和k,1≤k≤n≤1000.输出开着的灯编号. 样例输入: 7 3 样例输出: 1 5 6 7 分析: 使用memset函数,将数组中一定长度中的内容替换成指定字符.其中有三个参数,第一个是需要替换的数组,第二个是替换的值,第三个是长度值,一般使用sizeof函数.