大榕树——让我们共成长!
大榕树 myDrs.org
您的位置:大榕树 \ 编程       |  Logo语言   |  Pascal语言   |  信息学奥赛   |  高考保送    |  HTML版本
|  Pascal语言>>Pascal入门>>PascalFAQ之特殊技术         本站全文搜索: 友情提示:

PascalFAQ之特殊技术
http://www.mydrs.org  1/1/2003  大榕树


如何实现卡时?

卡时是一种让程序在运行了指定长度的时间以后可以自动终止运行并输出结果的技术,其基本原理通常是在程序启动时获取启动时间,然后在程序重复执行的地方获取当前时间,通过计算时间差判断程序已经运行了多久,当程序已运行的时间达到或接近指定的时间后立即输出已知的最优结果并且中断程序。卡时技术通常用在使用穷举或搜索的程序中。

在Turbo Pascal中,可以通过访问MemL[Seg0040:$006C]来获取当前时间,它返回的是当日零时到现在所经过的时间,单位约为55毫秒(约1/18.2秒)。下面是一个使用卡时技术的样例程序:

{$N+}

var
  StartTime: Longint;
  I, J: Extended;

begin
  StartTime := MemL[Seg0040:$006C];
  I := 0;
  J := 0;
  repeat
    if I * I - 1234567 * I + 777 < J * J - 1234567 * J + 777 then J := I;
    I := I + 1;
  until MemL[Seg0040:$006c] - StartTime >= 500 div 55;
  Writeln('x^2 - 1234567x + 777 has a minimum result when x = ', J: 0: 0);
end.

上面的程序在运行0.5秒以后将自动输出结果并结束运行。注意,该程序如果跨越零时运行,将无法自动结束程序。如果你希望你的程序在跨越零时运行时仍然可以自动结束,请自行优化你的程序。

在Free Pascal中,很难像Turbo Pascal一样直接访问内存(除非你使用DOS模式编译),通常只能通过调用系统函数来获取当前时间,但在比赛中一般是不允许程序调用系统函数的,因此很难实现卡时。


作 者:陈世熹
共有9730位读者阅读过此文

  • 上篇文章PascalFAQ之基本技巧
  • 下篇文章IOI2003国家集训队难题讨论

  • 发送邮件
    保存页面 打印文章 HTML版本 发表评论

    □- 近期热门文章 □- 相关文章
    1. NOIP2006竞赛大纲 [8307]
    2. 七类高中生具有保送资格 [5911]
    3. NOI2006获奖选手名单 [4956]
    4. 关于举办NOIP2006模拟赛的通告 [4107]
    5. Turbo Pascal各语句运行速... [3595]
    6. Turbo王者归来新Delphi免费... [3182]
    7. IOI2006我国4名选手全部获得金... [2946]
    8. 关于APIO2007与IOI2007... [2764]
    9. noip倒计时 by 枯叶蝴蝶 [2684]
    10. 朱泽园:思想上的金牌更重要 [2169]
    PascalFAQ之特殊技术
    PascalFAQ之基本技巧
    PascalFAQ之数据类型
    PascalFAQ之语法专题
    PascalFAQ之输入输出
    PascalFAQ之内存分配
    PascalFAQ编译指示专题
    PascalFAQ编译模式专题
    PascalFAQ编程工具专题
     

    关于本站 | 合作伙伴 | 联系方式
    大榕树 版权所有 ©1999-2006 www.myDrs.org 闽ICP备05000721号