acm的一道问题,不知道为什么Time limit exceeded

Time Limit: 1.0 second
Memory Limit: 16 MB

Let's consider an infinite sequence of digits constructed of ascending powers of 10 written one after another. Here is the beginning of the sequence: 110100100010000… You are to find out what digit is located at the definite position of the sequence.
Input
There is the only positive integer number N in the first line, N < 65536. The i-th of N left lines contains the positive integer Ki — the number of position in the sequence. It's given that Ki < 231.
Output
You are to output N digits 0 or 1 separated with a space. More precisely, the i-th digit of output is to be equal to the Ki-th digit of described above sequence.
Sample

input
output

4
3
14
7
6
0 0 1 0

程序结果正确,格式无误,但就是不能通过,求教高手
#include<stdio.h>
#include<stdlib.h>
unsigned long x[65540];
int main()
{
long l;
unsigned long n,i,j,k;
scanf("%ld",&n);
k=0;
for (i=0;i<n;i++)
scanf("%ld",&x[k++]);
for (l=0;l<n;l++)
{
j=1;
for (i=0;i<x[l]-1;)
{
i+=j;
j++;
}
if(i==x[l]-1)
printf("1");
else printf("0");
if(l<n-1)printf(" ");
else printf("\n");
}
return 0;
}

第1个回答  2013-08-14
错误时说你时间超时,就是程序运行的有点慢,我没看题意,但看了你的程序,感觉在i从1开始加,然后加这个循环可以省略的,你可以(x[l]-1-i)*2,然后开根号结果为y,然后判断y*(y+1)/2+i判断是否等于x[i]-1, 因为从1开始加的等差序列,求和不就是首项加末项,乘以项数,除以2。你可以把题目链接发一下。。。 我觉得ki是小于2的31次方吧,不然会超时,所以数值,用long long比较好,乘以2之后会不会数据溢出。。。下面代码应该能AC吧
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
int ncases,n;

scanf("%d",&ncases);

while( ncases-- )
{
scanf("%d",&n);
int k = (int)(sqrt((double)2*(n-1)));
if( k*(k+1ll)/2+1 == n )
printf("1");
else
printf("0");
if( ncases ) printf(" ");
}

return 0;

}

acm的一道问题,不知道为什么Time Limit Exceeded
如果你TLE的话,那么这就一定是一道卡常数时间的题了。题意很简单,从你代码中也可以看出,你对每一个点的周围8个均做了判断,那么这一块计算的最大复杂度就是100*100*8,其实只要建一个辅助数组f[101][101],f[i][j]表示从左上角(0,0)到(i,j)的雷的总数量,那么f[i][j] = f[i-...

acm的一道问题,不知道为什么Time limit exceeded
错误时说你时间超时,就是程序运行的有点慢,我没看题意,但看了你的程序,感觉在i从1开始加,然后加这个循环可以省略的,你可以(x[l]-1-i)*2,然后开根号结果为y,然后判断y*(y+1)\/2+i判断是否等于x[i]-1, 因为从1开始加的等差序列,求和不就是首项加末项,乘以项数,除以2。你可以...

Time Limit Exceeded和Output Limit Exce
在ACM编程竞赛中,遇到"Time Limit Exceeded"(超时)问题通常是由于程序运行效率低下,耗时过长。要解决这个问题,关键在于优化算法和代码结构,以提升执行效率。相比之下,"Output Limit Exceeded"(输出限制超出)虽然名称上看似与输出有关,实际上多数情况源于输入处理不当。比如,C语言在ACM中常常通过wh...

acm1597题没过Time Limit Exceeded如何解?
在解决 ACM 1597 题目时,遇到“Time Limit Exceeded”(超时)问题的处理方法至关重要。通常情况下,超时问题的根源在于程序的执行效率或者算法的优化空间。针对这个问题,我们可以从多个角度入手进行优化,以提升程序执行效率,避免超时错误的发生。以下将从代码优化、数据结构选择和算法改进三个方面提供一些...

acm_A hard puzzle 为什么会出现 Time Limit Exceeded 错误...
第一个方法肯定不行, 2^30次循环,必须超时。第二个方法死循环。第一个方法明明是 while(cin>>n>>num) 这样遇到文件尾就会退出。你用while(1)这是永远出不来的。。你是用了周期性吧,但是肯定不会超时。把死循环解决的话。其实你可以用这样, a^b = (a^2)^(b\/2) = a^(2*2*2...

ACM总是Time Limit Exceeded,到底是WRONG ANSWER还是算法太暴力,还是死...
你的代码是没有错的 只是某个tesecase执行时间超过的限制 你想想假如我n=50000 q=100000 你的程序最好的情况要查找多少次? 100000 * (1 + 2 + 3 + 。。。 50000)你要取巧已空间换时间 定义一个 100001 的数组a , i(1-n) 每输入一个数 k a[k] = i 那么下面...

ACM Time Limit Exceeded求解释
这其实就是计算斐波那契数列,f(n) = f(n-1) + f(n-2)递归当然会超时,重复计算太多,可以用备忘录方法、动态规划 或者 只用两个变量计算,int i, p = 1, q = 0;for(i=0; i<M; i++){ q += p;p = q-p;} 最后q就是f(M)

acm中Time Limit Exceeded怎么解决
while(scanf("%d",&n)<=i) \/\/这句有问题scanf接收一个值的输入每次的返回值一样都是1,这样程序会无休止运行 ,把这句改成for语句

杭电acm1003 请教大神们看看为什么总显示 Time Limit Exceeded...
那几个for太坑了,虽然看不懂你用那几个for用来干嘛,还有max,不知道你为什么把它全部加起来,但复杂度高是逃不了了的。这道题感觉你思路不清楚,应该用动态规划做,而且不用开数组,边输入边处理数据好了,核心只要一个for就够了。不懂你可以追问的。

acm c语言问题求助 总是time limit exceeded
acm你知道这是超时了对吧,就那你这个来说,那c也可以从两者最大值开始 也许你应该换种算法,你这个是最简单的枚举,网上自己百度吧,毕竟没你的OJ系统,没办法用源码测试

相似回答