昨日,帮助某新生 OJ O J 出数据,一下子有些不知所措,因为虽然打了两年多 ACM A C M ,刷了一些 OJ O J ,但是因为我们学校没有自己的 OJ O J ,所以也没有出题出数据的经验,猛一下要求写数据机,还真不是特别趁手。

该新生 OJ O J 要求每道题生成十组数据,输入数据放在 .in ∗ . i n 文件,输出数据放在 .out ∗ . o u t 文件, :110 ∗ : 1 ∼ 10 ,由于很少用到文件操作,所以多少有些生疏,折腾了十几分钟才写好这短短的几行模板,然后一直套用这个模板出了七道题的数据,为了防止下次再遇见这种情况,就简单记录一下这个简单数据机的模板吧……

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <ctime>

using namespace std;

const int MOD = 1001;
const int GROUP_NUM = 10;

string getname(int i, string a)
{
    stringstream ss;
    ss << i << a;
    return ss.str();
}

int main()
{
    srand((unsigned)time(NULL));

    for (int ce = 1; ce <= GROUP_NUM; ce++)
    {
        string name1, name2;
        name1 = getname(ce, ".in");
        name2 = getname(ce, ".out");

        fstream fp1, fp2;
        fp1.open(name1, ios::out);
        fp2.open(name2, ios::out);

/****** 数据之间的逻辑 ******/

// int a = rand() % MOD;
// int b = rand() % MOD;
// int c = rand() % MOD;
// fp1 << a << ' ' << b << ' ' << c << '\n';
//
// int tmp = a + b;
// int flag = 1;
// if (tmp > c)
// {
   
// flag = 0;
// }
// else if ((tmp & 1) != (c & 1))
// {
   
// flag = 0;
// }
//
// if (flag)
// {
   
// fp2 << "Yes\n";
// }
// else
// {
   
// fp2 << "No\n";
// }

/****** 数据之间的逻辑 ******/

        fp1.close();
        fp2.close();
    }

    return 0;
}

出数据其实真的是一个难事儿,当然,难的不是这个模板,而是变化繁多的题目,题目数据之间的关系注定了很多题无法简单的靠随机出数据,而是需要自己构造略微麻烦或者特别麻烦的生成数据逻辑,这个逻辑千变万化,问题各种各样的,昨天遇见的几个问题就烦的我,不要不要的,比方说,答案只有 A A B 两面,纯粹随机的数据绝大多数都是 A A 面,如果只随机 10 组,很大的可能十组数据的结果都是 A A ,而这样显然是不行的,还需要构造 B 的情况,这就很僵硬了,再比方说,有的题需要特判才行,因为结果不唯一,不能再按照原来的进行输出结果与正确的结果对比来判了,而是需要将输出结果跑一遍特判程序才能判定是否正确。

总而言之,有的题数据很好出,数据间的关联性不强甚至没有,只要任意随机即可,而有的题,数据之间环环相扣,需要保证数据的合法性,就需要极其复杂的构造数据的逻辑,这个真的累……有的时候真的不 OK O K ,就只能手构,那好家伙,累的够呛,怪不得这个时代,数据是最值钱的。

暂且就这样吧,欢迎一起交流出题出数据的奇葩经历……不过,在这方面,我真的是菜鸡。