四轮评分按优先级判定:先淘汰出现 D 或两个 C 的人,通过者中无 D 且 A 达三个给 sp offer,其余给 offer。
OJ: roj
题目 ID: 10004
难度:入门
标签:入门条件判断字符串python
创建: 2026-10-02 17:24
更新: 2026-10-04 21:37
题目描述
每人四轮面试,每轮评分 A/B/C/D 之一:出现一次 D 或两次 C 就失败;没有 D 且至少三个 A 得 special offer;其余得普通 offer。
输入第一行 failed / offer / sp offer。样例:输入 2、AAAB、ADAA,输出 sp offer、failed。
思路
结果只由 A、C、D 的个数决定,与位置无关,逐串统计即可。判定必须按优先级:先淘汰(有 D 或 C 至少两个),再判无 D 且 A 至少三个给 sp offer,否则给 offer。顺序不能颠倒,否则 AAAD 这类有三个 A 却带 D 的串会被误判成 special offer。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-10-02 17:25
# update_at: 2026-10-04 10:36
import sys
FAIL = "failed" # 淘汰:出现过 D,或 C 累计两次
OFFER = "offer" # 通过,但没拿到 special offer
SPECIAL = "sp offer" # 通过且无 D、A 达三个(词间空格与官方评测输出一致)
def judge(score: str) -> str:
"""按四轮评分判定一个人的结果:先判淘汰,再判是否 special offer。"""
if "D" in score or score.count("C") >= 2:
return FAIL
return SPECIAL if score.count("A") >= 3 else OFFER
def solve() -> None:
data = iter(sys.stdin.read().split())
T = int(next(data)) # 面试者个数
scores = [next(data) for _ in range(T)] # 每人一行长度为 4 的评分串(字母串,按 next 顺序取)
print("\n".join(map(judge, scores)))
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-04 21:37
* update_at: 2026-10-04 21:37
*/
// main.cpp:按三条规则判定每名面试者的四轮评分结果。
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
ll T;
string score; // 当前面试者长度为 4 的评分串
// 判定一个人的结果:先判淘汰(有 D 或 C 至少两次),再判无 D 且 A 至少三个。
string judge(const string &s) {
ll cnt_c = 0; // C 的个数,用于淘汰判断
ll cnt_a = 0; // A 的个数,用于判断 special offer
bool has_d = false; // 四轮中是否出现过 D
ll len = s.size();
for (ll i = 0; i < len; i++) {
if (s[i] == 'D') has_d = true;
if (s[i] == 'C') cnt_c++;
if (s[i] == 'A') cnt_a++;
}
if (has_d || cnt_c >= 2) return "failed";
if (cnt_a >= 3) return "sp offer"; // 中间的空格是官方输出的一部分
return "offer";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> T;
for (ll i = 1; i <= T; i++) {
cin >> score;
cout << judge(score) << '\n';
}
return 0;
}