什么是对候选人进行排名的最佳,最有效的方法

时间:2011-09-06 01:45:59

标签: c++ c algorithm

有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中遇到了这个问题

3 个答案:

答案 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)

另一个想法是使用静态变量来存储目前为止具有最高%的候选人的名称。 如果他具有高于当前候选人的%,则使用学生的姓名更新静态变量在进一步函数调用上的值, 最后,具有最高分的学生将在静态变量中显示该值。

如果你不想要所有候选人的列表%并且还有一个使用静态变量的权限,这将是一个更好的解决方案。