候选人的得票数
1 条题解
-
0
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