C 在线判断超出时间限制

C 在线判断超出时间限制,c,C,今天我尝试了一个在线编码比赛。当我试图提交答案时,我收到了“时间超过”的警告。给出的时间限制为1秒。当我在我的pc上编译它时,它是即时的,没有延迟,但是当我尝试在IDE中编译相同的源代码时,它给了我5秒!这怎么可能?在线竞赛中的时间限制是什么意思?是编译时间还是从程序开始到结束所花费的时间(即编译+用户输入+输出) 检查问题 我的代码-C #include<stdio.h> void sort(); int count = 0,health[500]; int main() { i

今天我尝试了一个在线编码比赛。当我试图提交答案时,我收到了“时间超过”的警告。给出的时间限制为1秒。当我在我的pc上编译它时,它是即时的,没有延迟,但是当我尝试在IDE中编译相同的源代码时,它给了我5秒!这怎么可能?在线竞赛中的时间限制是什么意思?是编译时间还是从程序开始到结束所花费的时间(即编译+用户输入+输出)

检查问题

我的代码-C

#include<stdio.h>
void sort();
int count = 0,health[500];

int main()
{
int terror,test,i=0,h = 0;
printf("\nTest cases: ");
scanf("%d",&test);
for( h = 1 ; h <= test ; h++)
{
    i=0;
printf("\nTerrorists: ");
scanf("%d",&terror);
while(terror > i)
{
    scanf("%d",&health[i]);
    i++;
    count++;
}
if(i%2 != 0)
{
    printf("\nNO");
}
else
{
    sort();
    int f=0,l=count,v=count,middle = (count/2)+1,j=0,sum1=0,sum2=0;
    for(j=0;j<=middle;j++)
    {
        sum1 += health[f]+health[l];
        f++;l--;
        sum2 += health[j+(middle/2)]+ health[v-(middle/2)];
        v--;
    }
    if (sum1 == sum2)
    {
        printf("\nYES");
    }
    else
    {
        printf("\nNO",);
    }

}
}
return 0 ;
}

void sort()
{
int i , j , a;
for (i = 0; i < count; ++i)
{
    for (j = i + 1; j < count; ++j)
    {
        if (health[i] > health[j])
        {
            a =  health[i];
            health[i] = health[j];
            health[j] = a;
        }
    }
}
}
#包括
无效排序();
整数计数=0,运行状况[500];
int main()
{
测试,i=0,h=0;
printf(“\n测试用例:”);
扫描频率(“%d”和测试);
对于(h=1;h i)
{
scanf(“%d”、&health[i]);
i++;
计数++;
}
如果(i%2!=0)
{
printf(“\nNO”);
}
其他的
{
排序();
int f=0,l=count,v=count,middle=(count/2)+1,j=0,sum1=0,sum2=0;
对于(j=0;j健康[j])
{
a=健康[i];
健康[i]=健康[j];
健康[j]=a;
}
}
}
}
那么,你能解释两件事吗

1)在线竞赛中的时间限制是什么意思?是编译时间还是从程序启动到终止所花费的时间(即编译+用户输入+输出)

2)我如何优化我的代码以避免将来出现TLE。建议对上述代码进行一些更正


谢谢。

你问了两个问题:

1。在线比赛中的时间限制意味着什么?

这是执行时间,而不是编译时间。无论如何,编译时间通常并不重要

2。如何优化代码以避免将来出现TLE?

通过使用
clock()
自己对程序计时。如果您无法在自己的计算机上满足时间要求,请不要提交答案。如果您的计算机速度较慢,您可以通过将结果与您自己的计时进行比较,从成功的答案中了解性能比率

这里有一种方法

#include <stdio.h>
#define TIMING 1   // conditional

#if TIMING > 0
#include <time.h>
clock_t start, elap;
#endif

int main()
{
#if TIMING > 0
    start = clock();
#endif

    // solve the problem here
    // mycode...

#if TIMING > 0
    elap = clock() - start;
    printf("Time = %f seconds\n", (double)elap / CLOCKS_PER_SEC);
#endif

    return 0;
}
#包括
#定义计时1//条件
#如果定时>0
#包括
时钟未启动,elap;
#恩迪夫
int main()
{
#如果定时>0
开始=时钟();
#恩迪夫
//在这里解决问题
//麦可德。。。
#如果定时>0
elap=时钟()-启动;
printf(“Time=%f seconds\n”(双精度)elap/CLOCKS\u/SEC);
#恩迪夫
返回0;
}

关于问题1,您是否查看了常见问题解答?您需要更好的排序功能。对于大型数据集,冒泡排序非常慢。如果(i%2!=0){printf(“\nNO”);}不总是
否,请尝试使用stdlib
中的qsort函数。考虑这个集合:<代码> 1, 2, 3 <代码>。恐怖分子的数量是奇数,但是
1+2==3
,所以这是
YES
@FiddlingBits哦,谢谢!那么,如何检查数字是否为奇数?最大限制为500,并逐个检查499,有太多的可能会超过时间。有解决方案吗?@harish还有一件事:您应该将
\n
放在每行的末尾,而不是开头。您可能因为输出末尾缺少换行符而超时如果我故意延迟输入怎么办?在终端中启动程序之前有没有办法提供输入?比如键入
/a.out
时有没有办法提供当时和那里的所有输入?为什么您会参加时间竞赛并故意延迟?取笑法官(计算机程序)?法官将通过重定向测试用例文件来提供输入。您可以使用类似于
myprog output.txt
(Windows控制台)的工具进行检查,这样您就可以检查您已经准备好的已知输入和输出的结果。挑剔。除非您有不同的计时编译,否则更喜欢
#ifdef TIMING
而不是
#if TIMING>0
。@FiddlingBits-FWIW,我有其他的变体,但我同意,答案有点松懈,但我希望这不足以推迟OP为自己实现计时的想法。