关灯问题 (思维)

题目链接http://acm.ayit.edu.cn/contest/12/problem/37
时间限制:1s    内存限制:256M   
题目描述
今年就这么结束了, zdw感到十分失望蓝桥杯写错签到题, cf rating狂掉, 最后区域赛打铜, 还突然变成JBer了失落的zdw准备睡觉(真咸鱼), 他想关灯, 然而发现开关坏了zdw愤怒地敲击着开关, 然后发现一个很神奇的事情: 如果灯之前已经关过了x次, 那么下一次打开它以后再关上它需要使用x+1次开关 具体情况请参考样例. 一开始灯是开着的。
输入描述
第一行一个整数T

表示数据组数接下来T行每行一个整数n表示zdw使用开关的次数
输出描述
共T行, 每行一个字符串"ON"或"OFF"表示目前灯是开着还是关着的具体见样例
样例输入

9
0
1
2
3
4
5
6
7
8

样例输出

ON
OFF
ON
ON
OFF
ON
ON
ON
OFF

样例描述
0次时就是初始状态, 显然灯是开着的1次时之前灯没有关上过, 所以按1次后灯就关上了, 是OFF
2次时灯重新被打开了
3-4次时因为灯之前已经关上1次了, 所以需要按2下来让灯再次关上(按完第4下后关上了)
5次时灯又重新被打开了
6-8次时因为灯之前已经关上2次了, 所以需要按3下来让灯再次关上(按完第8下后关上了)
数据范围
T <= 100000

n <= 1018

子任务1:(10分)
n<= 108

子任务2:(20分)
无其他限制

分析
分析可得灯在1 4 8 13 19。。。。这样的数字是关闭的。
我们要做的就是分析这些数字有什么特征。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2 * 4+4= 3 * 4;
2 * 8+4= 4 * 5;
2 * 13+4= 5 * 6;
代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        LL n;
        scanf("%lld",&n);
        LL mod=sqrt(2*n+4);
        if(mod*(mod+1)==2*n+4)
            printf("OFF\n");
        else
            printf("ON\n");
    }
    return 0;
}

需要好好调控,整理一下自己

发布了165 篇原创文章 · 获赞 6 · 访问量 5069

猜你喜欢

转载自blog.csdn.net/lylzsx20172018/article/details/103314486