声明:
- 并不是真的找,只是感觉如果真的要送一张票找人陪我看(是的我确实有两张票(炫耀)),我会这样根据 XP 和实用性(?)来做决定。
叠甲:
- 代码水平不怎么样且玻璃心,如果觉得哪里有问题,希望能被指出问题而不是说我菜><说我菜我就哭(不是)
- 有些函数的具体内涵不一定和命名完全吻合(对我说的就是你
leetcodeHard),因为不是真的找所以就写个名字,发出来主要是为了博看官一笑,希望不要做价值判断,非要做我也不介意但我大概率不会解释的
const PRIORITY = [
{1, c => c.code.codeforces.rating >= 2000},
{2, c => leetcodeHard(c)},
{3, c => c.singing.lesMiserables.canSingAllTunes && c.isV2EXer},
{4, c => c.videoGame.theWitness.hasFullAchievements},
{5, c => c.body.hand.isPretty && willingHoldHands(c) && c.isV2EXer}
];
const CONDITIONS = [
c => isStudent(c),
c => c.gender == male,
c => c.major == "math" || "CS" || "EE",
c => knowsLesMiserables(c)
];
const finalJudging = [
c => c.code.codeforces.rating,
c => -c.education.schoolRank,
c => -c.education.majorRank,
c => c.singing.ability
]
Candidate select(candidates) {
vector<vector> priorityCandidates(4);
for (c : candidates) {
int x = 0;
for (p : PRIORITY) {
if (p.second(c)) {
x = p.first;
break;
}
}
if (x == 1) {
return c;
// 不会吧不会吧不会真有 cf2000 吧
}else if (x > 0) {
priorityCandidates[x-2].push_back(c);
}
}
for (candidatesList : priorityCandidates) {
Candidate result;
int prev = 0;
for (c : candidatesList) {
int x = conditionsMetCount(c);
if (x == 4) {
return c;
}
if (x > prev) {
prev = x;
result = c;
}
}
if (result) {
return result;
}
}
vector<Candidate> conditionCandidates;
for (c : candidates) {
bool meetAllConditions = true;
for (con : conditions) {
meetAllConditions &= con(c);
}
if (meetAllConditions) {
conditionCandidates.push_back(c);
}
}
if (conditionCandidates.empty()) {
throw error("没有找到合适的人!");
}
sort(conditionCandidates, (a, b) => {
for (f : finalJudging) {
if (f(a) != f(b)) {
return f(a) > f(b);
}
}
});
return conditionCandidates[0];
}
try {
Candidate chosen = select(candidates);
// 因为 candidates 数组本身就是按时间顺序排序的,所以有几个默认返回前者的情况。
} catch () {
cry();
}
注:
- AI 参与命名与审阅(但很多有道理的我没改)
- 感觉逻辑有点复杂可读性有点差,写伪代码就是为了一眼看过去就看明白怎么回事(顺便偷懒+掩盖自己很多地方会写错),但同时又需要很多判断逻辑处理各种情况……><