ACM比赛常用技巧
本文介绍ACM程序的常用技巧,包括计算程序的运行时间,以及利用随机生成数据多次对拍。本文介绍的方法均分在Windows下和Linux下。
例题说明
本篇博客均以下面的例题来说明代码的用法。
题目描述:给出n个数字,找出第一个不小于k的数字,如果不存在输出-1
输入:第一行两个整数n,k,接下来n个整数a[i], (1 <= n <= 1e3, 1 <= k, a[i] <= 1e9)
计算程序运行时间
写在程序中的计算时间的方法
|
|
此时的运行脚本如下(windows环境 .bat
文件)
|
|
运行结果如下图[1]
其中用了检测ONLINE_JUDGE
这个宏的方法,可以保证在提交时不会因为忘记注释这个而WA一发。
在运行脚本中检测
代码如下:
|
|
Windows 10 环境下
运行脚本如下:
|
|
运行结果如下图:
Linux 环境下
运行脚本如下:
|
|
运行结果如下图:
其中 real 表示总运行时间,user和sys分别表示cpu在用户态和核心态的运行时间。
脚本和cpp文件在同一级目录下。
生成随机数据并对拍
这是两个关联的行为,要不断的生成数据,分别执行你自己的代码,以及暴力的对拍程序或者标程,然后对比两个文件的异同。
本次要被对拍的代码如下:
|
|
将要执行的暴力程序如下:
|
|
生成随机数据的程序如下:
|
|
- assert很重要
- rand函数是从2017年多校的标程扒下来的,解决了普通rand范围小的问题
- 输入可以带一个参数来初始化种子,具体见脚本
Windows下的测试脚本如下:
|
|
其中,测试正确时结果如下:
用下面这个错误的程序对拍:
|
|
结果如下:
Linux下的测试脚本如下:
|
|
正确时会一直输出AC,直到出现WA,样例结果如下:
- 1.左侧panel为输入,右侧为输出 ↩