Skip to content

1440: OJ 的继承与派生(19年期末机考T3)

题目

题目描述

题目背景

经过一个学期小作业和机考的洗礼,相信大家对 onlinejudge 有了一定的了解。终于到了期末机考,这次是没机会拿 onlinejudge 当调试器了(误),但摆在你面前的是一个实现简单 onlinejudge 派生类的题目。

给你的是一个 BaseJudger 基类,现在需要你完成的是 ICPCJudger 派生类、 OIJudger 派生类和 SpacialJudger 派生类。实现的目的很简单,就是能够用它们对提交的 timememoryoutput 在不同 judge 机制下进行评分。

题目描述

给了你一个基类 BaseJudger,其中你只需要在// todo 的地方补全构造函数和析构函数即可,其他地方不允许进行任何修改,不允许添加任何成员和成员函数。(下发代码中的size_t 是一种数据类型,你可以把它当作非负的 int

题目的重点是需要你在此基础上派生出 class ICPCJudgerclass OIJudgerclass SpacialJudger

派生类中请根据需要添加你需要的成员以及成员函数。

ICPCJudger

ICPCJudger 的构造方式, judger = new ICPCJudger(time_limit, memory_limit, answer);

ICPCJudgerSubmit 评测标准是:

time <= time_limit && memory <= memory_limit 并且答案正确时给 100 分,其余都给零分;

可以多次 Submit 并且取最高的分数;

答案正确的要求是 outputanswer 完全相同;

OIJudger

OIJudger 的构造方式, judger = new OIJudger(time_limit, memory_limit, answer);

OIJudgerSubmit 评测标准是:

time <= time_limit && memory <= memory_limit 并且答案正确时给 100 分,其余都给零分;

只能 Submit 一次取唯一分数,一旦多次提交直接爆零。

注意:不同于 ICPCJudger 的是, OIJudger 对答案正确的要求是忽略 outputanswer行尾的空格的(如果 answer 是多行的,则忽略每一行行尾空格);

SpacialJudger

SpacialJudger 的构造方式,judger = new SpacialJudger(time_limit, memory_limit, full_score_time, full_score_memory, answer);

SpacialJudgerSubmit 评测标准:

当用 SpacialJudger 评测的时候,会额外给出两个指标 full_score_timefull_score_memory

除了要求答案正确以外,对于 time 指标,当 time <= full_score_timetime_score给 100 分,当 time >= time_limittime_score 指标给 0 分,对于 full_score_time < time < time_limit 的情况, time_scoretime 是线性关系,对于 memory 指标是同理的(time_scorememory_score 的计算均向下取整),并且最后的分数是由 floor(time_score * memory_score / 100) 得到的。(也就是说,如果 timememory 都是 50 分,最后的得分是 25 分)

可以多次 Submit 并且取最高的分数。

对答案正确的要求同 ICPCJudger 一样;

你的代码可以以如下框架为基础: ```c++

include

include

include

include

class BaseJudger { public: BaseJudger (size_t time_limit , size_t memory_limit , const char *answer) // todo }

virtual void Submit (size_t time , size_t memory , const char *output) = 0;

size_t GetScore () const { return score_; }

virtual ~BaseJudger () {
    // todo
};

protected: char *answer_; const size_t time_limit_; const size_t memory_limit_; size_t score_;

virtual bool CheckAnswer (const char *output) const {
    // the output must equal to the answer
    return strcmp(answer_ , output) == 0;
}

};

class OIJudger // todo

class ICPCJudger // todo

class SpacialJudger // todo ```

如下test.cpp可供调试参考: ```c++

include

include "code3.hpp"

using namespace std;

string get_data () { // ignore empty lines string ret = "" , line; while (getline(cin , line)) { if (line.length() == 0) { continue; } if (line == "#####") { break; } ret += line + "\n"; } return std::move(ret); }

int main () { char judger_name[100]; cin >> judger_name; size_t time_limit , mem_limit; cin >> time_limit >> mem_limit; BaseJudger *judger = nullptr; string tmp; if (strcmp(judger_name , "OIJudger") == 0) { tmp = get_data(); judger = new OIJudger(time_limit , mem_limit , tmp.c_str()); } else if (strcmp(judger_name , "ICPCJudger") == 0) { tmp = get_data(); judger = new ICPCJudger(time_limit , mem_limit , tmp.c_str()); } else if (strcmp(judger_name ,"SpacialJudger") == 0) { size_t full_score_time , full_score_memory; cin >> full_score_time >> full_score_memory; tmp = get_data(); judger = new SpacialJudger(time_limit , mem_limit , full_score_time , full_score_memory , tmp.c_str()); } else { cout << "Unknown Judger type" << endl; return 0; }

size_t submit_time , submit_mem;
while (cin >> submit_time >> submit_mem) {
    tmp = get_data();
    const char *output = tmp.c_str();
    judger->Submit(submit_time , submit_mem , output);
}
cout << judger->GetScore() << endl;
delete judger;
return 0;

} ```

输入格式

输入的第一行是 judger_name

输入的第二行给出了在当前 judger 下需要给出的若干项指标

输入的接下去若干行是正确的 answer(保证多行 answer 之间没有空行)

输入一行 ##### 分割符,以判断 answer 读取完毕

接下去的输入都是提交,可能会重复多次。

每次提交的第一行是 timememory

每次提交的接下去若干行是 output(保证多行 output 之间没有空行)

每次提交的最后一行是 ##### 分割符,以判断一次提交结束

输出格式

一行一个数,即最终的 score

样例输入

```text ICPCJudger 1000 1000 abcd dcba

500 1001 abcd dcba

500 500 abcd dcba

```

样例输出

text 100

数据范围

$1-4$ 测试点, judger_name = ICPCJudger

$5-7$ 测试点, judger_name = SpacialJudger

$8-10$ 测试点, judger_name = OIJudger

测试数据中保证分数始终为整数,且能被整除。

Oops! 本题目还没有解答!

助教老师们编题的速度,已经超过了解题的速度!

OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。

如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!