ECNU || 热河路

思路

【数据范围】 对于100%的数据有N≤1500000,Ai≤10^9
我们观察序列,发现这个序列可以分为很多组,每一组为1和很多0 0的个数取决于他前面的1是第几个1

一种数论方法:

只要求出距离k最近的1所在位置即可
不难发现 每一个出现1位置都符合n*(n+1)/2+1,于是进行以下推导:
设k=n*(n+1)/2(n为最近的1所在位置,k为询问的位数
则有2k=n(n+1)
可见n=trunc(sqrt(n*(n+1)))=trunc(sqrt(2k))
求出n后只要判断k是否等于n
(n+1)/2+1即可
t:=trunc(sqrt(2k));
if k<>(t
t+t) div 2+1 then
ans[i]:=0
else
ans[i]:=1;

原文:https://blog.csdn.net/ametake/article/details/46849015

代码

TLE只拿了90分,待思考

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for(int i = 0; i < n; i++){
            int x = sc.nextInt();
            int k = (int)(Math.sqrt(2*x));
            if((k*k+k)/2+1 == x){
                System.out.println(1);
            }else{
                System.out.println(0);
            }
        }
    }
}
满分代码
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
int main()
{
	int x,n;
	double d;
	scanf("%d",&n);
	for(int i=0; i<n; i++)
	{
		scanf("%d",&x);
        d=(sqrt(x*2-1.75)-0.5);
		if((int)d*1.0 == d) printf("1\n");
		else printf("0\n");
	}
	return 0;
}

知识

⭐java取整
https://www.cnblogs.com/hanxue53/p/4315439.html

你可能感兴趣的:(刷题)