對拍程序


在信息學競賽中,尤其是考試的時候,經常會出現把水題寫水的情況,而題目那一兩個單薄的測試數據常常不足以讓我們發現自己程序中的BUG。在競賽時,水題悲劇了的話下場一定會很慘。在這種情況下,我們可以采用寫一個對拍程序的方法來大大降低出錯的可能。

 

基本思路 是對於一道題目來講,寫出高效算法后,時間充裕的情況下再寫一個純暴力的算法,寫一個數據生成器,對你的程序和暴力程序的結果進行比對,出現錯誤后就人工 檢查。一般來講數據范圍一開始可以小一點,小數據過了以后再慢慢擴大,為保證正確性你在寫下一題的時候可以讓對拍程序一直跑着。

這里的關鍵是要寫一個批處理讓Windows不停地反復執行這一操作,代碼如下。

 

1     @echo off  
2     :loop  
3         datamaker  
4         std  
5         myprogram  
6         fc myprogram.out std.out  
7     if not errorlevel 1 goto loop  
8     pause  
9     go to loop  

 
在文本文檔中寫好以后,擴展名保存為bat即可直接運行。

簡單解釋:
datamaker   #數據生成器,生產隨機數據到myprogram.in
std         #純暴力標准程序,從myprogram.in讀入數據,運行后輸出標准答案到std.out
myprogram   #高效程序,即你最終要提交的程序,從myprogram.in讀入數據,運行后輸出標准答案到myprogram.out

 
        
對拍指的是用一個簡單的程序去檢測一個復雜的程序。
具體的方法就是:
1、隨機生成n組數據。
2、用復雜的程序把數據跑一遍。(因為你要檢查的就是這個程序,可能會有小漏洞,用這個可以檢查出來)。
3、用簡單的程序把數據跑一遍。(簡單的程序不要錯就行了)
4、對比兩次的答案,如果不一樣,你就要檢查自己的程序了。

ACM的程序怎么設置對拍程序??有沒有那個好心人給我和例子吧,
基本思路是對於一道題目來講,寫出高效算法后,時間充裕的情況下再寫一個純暴力的算法,寫一個數據生成器,對你的程序和暴力程序的結果進行比對,出現錯誤后就人工檢查。一般來講數據范圍一開始可以小一點,小數據過了以后再慢慢擴大,為保證正確性你在寫下一題的時候可以讓對拍程序一直跑着。
這是別人說的,可是那個數據生成器和高效程序和暴力程序都是什么啊?不明白。
有完整例子可以加分。。
---------------------對拍程序介紹,來自百度-----------------------------------------
在信息學競賽中,尤其是考試的時候,經常會出現把水題寫水的情況,而題目那一兩個單薄的測試數據常常不足以讓我們發現自己程序中的BUG。在競賽時,水題悲劇了的話下場一定會很慘。在這種情況下,我們可以采用寫一個對拍程序的方法來大大降低出錯的可能。
基本思路是對於一道題目來講,寫出高效算法后,時間充裕的情況下再寫一個純暴力的算法,寫一個數據生成器,對你的程序和暴力程序的結果進行比對,出現錯誤后就人工檢查。一般來講數據范圍一開始可以小一點,小數據過了以后再慢慢擴大,為保證正確性你在寫下一題的時候可以讓對拍程序一直跑着。
這里的關鍵是要寫一個批處理讓Windows不停地反復執行這一操作,代碼如下。


對拍程序的寫法 如下
@echo off
:loop
datamaker #數據生成器 rand.exe > data.in 這里的大於符號,小於符號為重定向符號
std #標准程序 std.exe < data.in > std.out
myprogram #my.exe < data.in > my.out 我的程序
fc ans.out std.out //比較兩個程序的輸出是否一致,一致則返回0
if not errorlevel 1 goto loop
pause
goto loop
#最后上邊的 內容 保存為.bat文件
#rand.exe std.exe my.exe 以及windows下的這個 .bat文件放在同一個目錄下
***************************************************************************************************
這里數據生成器: 就是你自己編寫一個應用程序 rand.exe,這個應用程序就是隨機的生成一組符合題意的輸入數據並存放到上邊提到的 輸入數據文件中data.in
高效程序:就是上邊提到的 高效算法 寫的程序,即 my.exe
暴力程序 :就是指能夠保證所有輸入數據都能輸出正確結果的 程序,即這里的std.exe
上邊的.bat文件 的功能就是循環 判斷高效程序和 暴力程序 在同樣的輸入數據情況下,輸出數據是否相同,從而實現了對拍程序的功能

比如舉一個簡單的例子: 求 1+2+3+……+n = ?
數據生成器:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int n;
srand((int)time(0)); //調用srand()函數,以系統時間為隨機種子
n = 1 + rand()%10000; //隨機生成一個1到10000的自然數
printf("%d\n",n); // 輸出隨機生成的自然數
return 0;
}

//編譯運行后,生成rand.exe可執行文件 然后在批處理文件中 直接調用 rand.exe>data.in即將上邊的輸出結果重定向到data.in文件中

暴力程序:算法 是直接從1加到n,執行n次循環 時間復雜度為 O(n)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,n;
long int sum = 0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum += i;
}
printf("%d\n",sum);
return 0;
}

//編譯運行后,生成std.exe可執行文件 然后在批處理文件中 直接調用 std.exe<data.in>std.out即將從data.in中獲取輸入,然后將輸出結果重定向到std.out文件中

高效算法: 算法為 1+2+……+n = n*(n+1)/2, 時間復雜度為O(1)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
long int sum = 0;
scanf("%d",&n);
sum = n*(n+1)/2;
printf("%d\n",sum);
return 0;
}

//編譯運行后,生成my.exe可執行文件 然后在批處理文件中 直接調用 my.exe<data.in>std.out即將從data.in中獲取輸入,然后將輸出結果重定向到my.out文件中
批處理文件 test.bat 內容如下
@echo off
:loop
rand.exe>data.in
std.exe<data.in>std.out
my.exe<data.in>my.out
fc my.out std.out
if not errorlevel 1 goto loop
pause
goto loop
最后將這三個.exe文件和批處理文件放到同一個目錄下 運行批處理文件即可



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM