面试

GitHub跳转原题关系图返回列表

四轮评分按优先级判定:先淘汰出现 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。

输入第一行 TT,之后 TT 行每行一个长度 4 的评分串;输出每人的结果 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;
}