OJ 简易数据生成器模板(数据机)

昨日,帮助某新生 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 ,就只能手构,那好家伙,累的够呛,怪不得这个时代,数据是最值钱的。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值