• 【OJ】HOW TO SOLVE Time Limit Exceeded


    转载自:https://blog.csdn.net/qian2213762498/article/details/82424900

    HOW TO SOLVE Time Limit Exceeded

    经常会遇到这种令人抓狂的情况

    自己编写的程序在dev_c&各版本的visual studio code&c++上怎么编译运行都能输出正确结果

    然而一提交,却无法Accept,很多时候显示的并不是Wrong Answer 而是比WrongAnswer更令人绝望的  。

    在oj中,给定的Time Limit 是1000MS,出现Time Limit  Exceeded则说明这个程序的运行时间超过了这个限度。

    经过几道题,我猜想了几个关于超时的原因:

    ———————————————————————————————————————————————————

    1.没有循环终止条件。

    就是说程序中存在一个循环,但是这个循环没有终止条件,或者说是条件太宽泛,在运行的时候虽然能输出结果,但这个循环会一直循环下去,导致运行时间过长。

    例如:

    在1001中,要测试多组数据,进行多次循环,

    如果这样写

    for(m=0;m>0;m++)

    scanf(.......)

    ......

    企图让输入一直循环,理论上并没有什么问题,程序也能运行正确,但却会超时。

    因为没有一个终止的条件,计算机会一直不断去运行,m只会无限大,这是实际一种很无赖的做法。

     

    而如果要想用一个合理的方式实现无限次循环,就需要用

    while(scanf()!=EOF)

    ......

    这里虽然也可无限次的循环,却有了终止条件:返回值为-1 的时候

    关于while(scanf()!=EOF)的用法原理,

    我再网上查阅得到:

      scanf("%d,%d", &a, &b)中

      如果a和b都被成功读入,那么scanf的返回值就是2

        如果只有a被成功读入,返回值为1

        如果a和b都未被成功读入,返回值为0

    如果遇到错误或遇到end of file,返回值为EOF。

     


    2.函数调用超时。

    例如:

    在1279中,需要用到一个n的阶乘。

    在第一次做的时候,我调用了一个递归函数来求阶乘,运行测试正确,却出现了超时情况。

    然后换了一种做法,用一个for循环去求阶乘,结果就通过了。

    我上网查询得到,递归调用因为经常会调用自身很多次,所以时间的复杂度是指数级别的。


    3.程序算法不够优化。

    就是说自己的程序太复杂,存在更快更有效率的方法。

    所以在解决问题时,应尽量选择简单的算法。

    如果遇到了这种情况,只能换一个思路了。


    4.程序本身存在问题。

  • 相关阅读:
    JS定义一个立即执行的可重用函数
    Git常用命令速记与入门
    设计的一些kubernetes面试题
    运维知识各种链接
    php7.2安装smbclient扩展
    logrotate自定义切割时间的一些坑
    【转】日志收集工具scribe
    ELK日志报警插件ElastAlert并配置钉钉报警
    consul-server集群搭建
    加油,骚年
  • 原文地址:https://www.cnblogs.com/yinjx/p/14051892.html
Copyright © 2020-2023  润新知