top1编程
← 返回题目
题解

候选人的得票数

1 条题解

  • 0
    @ 2026-8-5 23:54:04

    P4615 候选人的得票数(入门)

    解题思路

    统计选票就像班级里选班委:黑板上写着三位候选人的名字,每收到一票,就在对应名字下面画一笔"正"字,最后数一数谁的笔画最多。这道题分三步来做。

    第一步,组织好三位候选人的信息。 有 li、zhang、sun 三位候选人,我们用结构体 Candidate 保存候选人的姓氏和得票数,把三位候选人放进一个数组,顺序固定为 li、zhang、sun,票数都从 0 开始。用结构体是为了让"姓氏"和"票数"这两样信息装在一起,读起来一目了然。

    第二步,读入选票并按首字母计数。 一共 n 位选民,每人投一票。读到一张票时,先判断它投给了谁,再把对应候选人的票数加一。三位候选人的姓氏首字母分别是 l、z、s,各不相同,所以可以直接看票面姓氏的首字母:是 'l' 就给 li 加票,是 'z' 就给 zhang 加票,否则(也就是 's')就给 sun 加票。题目保证每张票都写的是这三位候选人之一,所以最后一种情况一定是 sun,不需要再单独判断。

    第三步,按固定顺序输出结果。 注意题目要求按 li、zhang、sun 的顺序输出"姓氏 得票数",每行一个候选人,而不是按得票多少排序,千万别画蛇添足。以样例为例,li 得 3 票、zhang 得 3 票、sun 得 4 票,就依次输出三行:li 3、zhang 3、sun 4。虽然 li 和 zhang 的票数一样多,但顺序是固定的,所以谁在前谁在后不受票数影响。

    **回顾总结。**统计票数就像画"正"字,一张票一笔。数组下标从 0 开始,所以 candidates[0] 是 li、candidates[1] 是 zhang、candidates[2] 是 sun,这个顺序别记反。用结构体把候选人的姓氏和票数绑在一起,读票时靠首字母快速判断归属,最后按固定顺序输出。只要记住"首字母各不相同"这个关键,代码写起来又快又不容易错。

    参考代码

    // 用途:统计 li、zhang、sun 三位候选人的得票数,并按固定顺序输出。
    #include <iostream>
    using namespace std;
    
    // 保存一位候选人的姓氏和得票数。
    struct Candidate {
        char name[10];      // 候选人姓氏。
        int voteCount;      // 候选人得票数。
    };
    
    int main() {
        int n;              // 选民人数。
        // 三位候选人,顺序固定为 li、zhang、sun。
        Candidate candidates[3] = {{"li", 0}, {"zhang", 0}, {"sun", 0}};
        cin >> n;           // 读入选民人数。
        // 依次处理每张选票。
        for (int i = 0; i < n; i++) {
            char ballot[10];    // 当前选票上的姓氏。
            cin >> ballot;      // 读入当前选票。
            // 根据姓氏的首字母统计票数。
            if (ballot[0] == 'l') {
                candidates[0].voteCount++;   // li 的票数加一。
            } else if (ballot[0] == 'z') {
                candidates[1].voteCount++;   // zhang 的票数加一。
            } else {
                candidates[2].voteCount++;   // 剩下的合法选票属于 sun。
            }
        }
        // 按固定顺序输出三位候选人的票数。
        for (int i = 0; i < 3; i++) {
            cout << candidates[i].name << ' ' << candidates[i].voteCount << '\n';
        }
        return 0;
    }
    

    复杂度分析

    程序把 n 张选票各处理了一次,每次判断首字母是 O(1) 的,所以时间复杂度是 O(n),n 最大为 100。空间复杂度是 O(1),只用了固定大小的结构体数组。整个程序简单高效。

    • 1