有N名候选人报名回答了一系列多项选择题。设计一种有效的方法来评估答案并对候选人进行排名。
vector <string> Evaluate (const string& answer, const vector<string>& param)
{
// answer - will have the answer for multiple choice question.
// like X X X X X where each X is a capital letter (A-D)
// (e.g) A B A C D
// param will have candidate name followed by his/her answer
// (e.g) param[0] - "Foo A C A C D"
// param[1] - "Bar D D A C B"
// return candidates name with highest % of mark in result[0],
// next highest in result[1] and so on.
}
我能想到的一种方法是将答案标记为&amp;参数并进行比较。但我正在寻找更好的方法。有什么建议吗?
PS:这不是作业。在topcoder中遇到了这个问题
答案 0 :(得分:1)
一个解决方案是通过所有候选人并按0到5的等级对他们的答案进行评分,其中0表示完美,1表示1个答案错误,等等。在对每个候选人进行评分后,将其插入列表中。然后在对所有候选人进行评分后,按等级对列表进行排序(或者在插入时对其进行排序)。
或者,您可以在添加它们时将它们添加到二叉搜索树中。这可能比将它们插入列表并对其进行排序更快。
答案 1 :(得分:1)
如果您假设答案之间有一个空格,则可以在不进行标记的情况下计算单个候选人的分数。首先,搜索第一个空格以跳过然后命名,然后将剩余的字符串传递给以下函数
int compute_score(const string& answer_key, const char answer[])
{
int score = 0;
for (unsigned i = 0; i < answer_key.size(); i+=2) {
score += answer[i]==answer_key[i];
}
return score;
}
答案 2 :(得分:0)
另一个想法是使用静态变量来存储目前为止具有最高%的候选人的名称。 如果他具有高于当前候选人的%,则使用学生的姓名更新静态变量在进一步函数调用上的值, 最后,具有最高分的学生将在静态变量中显示该值。
如果你不想要所有候选人的列表%并且还有一个使用静态变量的权限,这将是一个更好的解决方案。