对拍数据
在OI赛制中,一般是10组或更多测试点,按照通过测试点百分比得分,10个数据通过1个点就是10分,25个数据通过5个点就是20分。
然而,在考试时只有样例数据可供参考,选手不知道通过样例通过后是否还可以通过其他测试数据。
对拍的应用:
1.选手在比赛中采用一种时间复杂度较低的高分算法,但是不能保证该算法的正确性。因此,先采用朴素算法生成求解程序。(该朴素算法时间复杂度较高,但是编写简单,不容易出错)。然后用高分算法与朴素算法对拍。
2.在线上题库做题时,出现错误,但是没有题解,需要自己对拍一些数据量较小的数据,进行对比。
生成a~b之间的随机整数
- #include <iostream>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- int randint(int a, int b){
- return rand() % (b - a) + a;
- }
- int main() {
- srand(time(0));
- int a, b;
- cin >> a >> b;
- cout << randint(a, b) << endl;
- return 0;
- }
- 在类Unix系统中,rand()返回一个[0,2147483647]之间的整数。
- 随机数就是一个很大的数据集合,看起来是随机的,但是实际上超出一定范围是循环的。
- srand(整数)设置随机种子,如果该整数是不变的,那么每次得到的随机数也是不变的,为了让每次得到的随机数不同,可以使用srand(time(0))。time(0)函数返回自格林尼治标准时间1970年1月1日00:00:00至当前时刻所流逝的秒数。
对拍流程
- 先让数据生成器输出数据。system("./data > data.in")
- 然后用这个数据跑一遍暴力代码,输出结果。system("./baoli < data.in > baoli.out")
- 再用这个数据跑一遍你写的正解代码,输出结果。system("./std < data.in > std.out")
- 把两个结果相比较,判断是不是一样的。system("diff std.out baoli.out")
[CSP-J 2021] 分糖果
生成 n,L,R 随机数据
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- int randint(int a, int b){
- return rand() % (b - a) + a;
- }
- int main() {
- srand(time(0));
- int n, L, R;
- n = randint(1, 1000000000);
- L = randint(1, 100);
- R = randint(1000000000 - 100, 1000000000);
- cout << n << " " << L << " " << R << endl;
- return 0;
- }
暴力枚举求解
- #include <iostream>
- #include <cstdio>
- using namespace std;
- int main() {
- int n, L, R;
- cin >> n >> L >> R;
- int res = 0;
- for(int i = L; i <= R; i++)
- res = max(res, i % n);
- cout << res << endl;
- return 0;
- }
标准答案程序(自认为的标准)
- #include <iostream>
- #include <cstdio>
- using namespace std;
- int n, L, R;
- int main() {
- cin >> n >> L >> R;
- if(L / n < R / n) cout << n - 1 << endl;
- else cout << R % n << endl;
- return 0;
- }
对拍程序
- #include <iostream>
- #include <cstdio>
- #include <ctime>
- #include <cstdlib>
- #include <unistd.h>
- #include <sys/time.h>
- using namespace std;
- int main() {
- int n = 10, cnt = 0;
- struct timeval start, end;
- for(int i = 1; i <= n; i++){
- system("./data > data.in");
- system("./baoli < data.in > baoli.out");
- gettimeofday(&start,NULL);
- system("./std < data.in > std.out");
- gettimeofday(&end,NULL);
- int t = 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;
- t = int(t * 1.0 / 1000);
- // cout << "t = " << t << endl;
- if(system("diff std.out baoli.out"))
- printf("测试点#%d Wrong Answer\n", i);
- else if(t > 1000){
- printf("测试点#%d Time Limited Exceeded,用时%dms\n", i, t);
- }
- else{
- printf("测试点#%d Accepted,用时%dms\n", i, t);
- cnt++;
- }
- sleep(1);
- }
- printf("最终通过%d个测试点\n", cnt);
- return 0;
- }
NOI Linux2.0 里面的图形化界面编程工具
NOI Linux2.0 相较于早期的Ubuntu16.04测评系统有了很大改进,界面美观,而且提供了多种C++编程工具,对于不熟悉命令的同学是一个很好的机会。
下面介绍一下code::blocks
新建空文件:
保存文件:
写代码、编译、运行:
也可以点击编译并运行。
本文暂时没有评论,来添加一个吧(●'◡'●)