• 关于Windows和Linux下的对拍


    对拍

    一、Windows下的对拍

    1、需要文件

    1. 编写的cpp文件及其生成的可执行文件,如:A.cpp和A.exe
    2. 保证答案正确的暴力求解文件,如:baoli.cpp和baoli.exe
    3. 数据生成文件,如:data.cpp和data.exe
    4. 保存生成数据的文本文件,如:A.in
    5. 保存输出答案的文件,如:A.out和baoli.out
    6. 对拍文件,如:check.bat或者check.cpp

    2、关于求解程序的输入和数据生成程序的输出

    在编写的cpp文件及暴力求解文件中,通过freopen函数重定向输入输出流(freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的)。

    输入:freopen("***.***", "r", stdin)

    输出:freopen("***.***", "w", stdout)

    3、编写随机数生成程序

    运用rand()函数生成随机数据,例如:

    #include<cstdlib>  //随机函数rand()在该头文件中
    #include<cstdio>
    #include<ctime>
    #include<iostream>
    
    using namespace std;
    
    int main() 
    {
    	freopen("a.in", "w", stdout);
    	srand(time(NULL));
    	int n = rand() % 20;
    	cout << n << '
    ';
    	for(int i = 0; i < n; i++)
    	{
    		char c = rand() % 26 + 'A';
    		cout << c;
    	}
    	
    	return 0;
    }
    /*
    1、rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。
    
    2、如果要产生0~99这100个整数中的一个随机整数,可以表达为:int num = rand() % 100; 
    
    3、如果要产生1~100,则是这样:int num = rand() % 100 + 1;  
    
    4、总结来说,可以表示为:int num = rand() % n +a;其中的a是起始值,n-1+a是终止值,n是整数的范围。
    
    5、一般性:rand() % (b-a+1)+ a ;    就表示  a~b 之间的一个随机整数。
    
    6、若要产生0~1之间的小数,则可以先取得0~10的整数,然后均除以10即可得到“随机到十分位”的10个随机小数。
    
       若要得到“随机到百分位”的随机小数,则需要先得到0~100的10个整数,然后均除以100,其它情况依 此类推。
    
    7、通常rand()产生的随机数在每次运行的时候都是与上一次相同的,这样是为了便于程序的调试。若要产生每次不同的随机数,则可以使用srand( seed )函数进行产生随机化种子,随着seed的不同,就能够产生不同的随机数。
    
    8、还可以包含time.h头文件,然后使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列,同时这要求程序的两次运行的间隔超过1秒。
    ————————————————
    版权声明:本文为CSDN博主「风暴计划」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/cmm0401/article/details/54599083
    */
    

    4、编写对拍程序

    1)直接用cpp文件

    如下:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <ctime>
    
    int main()
    {
    	for(int T = 1; T <= 1000; T++)
    	{
    		//自行设定适当的路经
    		system("D:/C/ACM/牛客比赛/小白月赛34/A/rand.exe");
    		//当前程序已经运行的CPU时间,Window下单位为ms,Unix下单位为s
    		double st = clock();
    		system("D:/C/ACM/牛客比赛/小白月赛34/A/A.exe");
    		double ed = clock();
    		system("D:/C/ACM/牛客比赛/小白月赛34/A/baoli.exe");
    		if(system("fc a.out baoli.out"))
    		{
    			//程序立即退出,此时a.in中的数据即为错误数据 
    			puts("Wrong Answer");
    			return 0;
    		} 
    		else printf("Accepted, 测试点 #%d, 用时 %.01fms
    ", T, ed - st); 
    	}
    	
    	return 0;
    }
    

    2)用bat文件

    文件后缀改为.bat, 程序如下:

    :loop
     rand.exe
     baoli.exe > baoli.out
     A.exe > a.out
     fc baoli.out a.out
     if not errorlevel 1 goto loop
    pause
    

    直接运行程序,如果输出不一样,程序终止,此时的A.in文件中的数据即为出错的数据。

    二、Linux下的对拍

    只有对拍文件不一样,如下:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <ctime>
    
    int main()
    {
    	for(int T = 1; T <= 1000; T++)
    	{
                //生成的可执行文件没有后缀
    	    system("./rand");
    	    double st = clock();
    	    system("./A");
    	    double ed = clock();
    	    system("./baoli");
                //此处的fc改为diff
    	    if(system("diff a.out baoli.out"))
    	    {
    		puts("Wrong Answer");
    		return 0;
    	    }
    	    else printf("Accepted, #%d, cost %.01fms
    ", T, ed - st);
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    webStrom 注释模板添加
    匹配正则 url 端口 域名
    监测数据类型封装方法
    base64图片展示(后端给base64数据,前端展示图片)
    倒计时
    机密16位
    mvc与mvvm的区别
    flex表格的使用
    flex中tab页面的实现
    flex中下拉框的实现
  • 原文地址:https://www.cnblogs.com/grain-rain/p/14825695.html
Copyright © 2020-2023  润新知