洛谷P1271 【深基9.例1】选举学生会_C++描述

题目描述

学校正在选举学生会成员,有 n(n≤999) 名候选人,每名候选人编号分别从 1 到 n,现在收集到了 m(m<=2000000)张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。输入 n 和 m 以及 m个选票上的数字,求出排序后的选票编号。

输入格式

输出格式

输入输出样例

输入
5 10
2 5 2 2 5 2 2 2 1 2
输出
1 2 2 2 2 2 2 2 5 5

题意

题意较明确,就是一个简单的排序

思路

第一反应就是直接调用快排来排序,然后又想到一个桶排思想的解法,但看了一眼数据量觉得可能会超时,试了一下果然超时了…

代码

AC代码

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring> 
#include<algorithm> 
using namespace std;
### Python 实现 P1271 选举学生会问题 此问题是于计数排序的思想来解决的。由于候选人的编号范围较小(`n ≤ 999`),而选票数量较大(`m ≤ 2,000,000`),因此可以利用数组索引来快速统计每个候选人获得的票数并按顺序输出结果。 以下是完整的 Python 解决方案: #### AC代码 ```python def main(): import sys input_data = sys.stdin.read().splitlines() # 获取输入的第一行和第二行数据 n = int(input_data[0]) # 候选人数 m = int(input_data[1]) # 总票数 votes = list(map(int, input_data[2].split()))[:m] # 取前 m 张有效选票 # 初始化计数器数组,长度为 n+1 (因为候选人编号从 1 开始) count_array = [0] * (n + 1) # 统计每位候选人的得票数 for vote in votes: if 1 <= vote <= n: # 确保选票合法 count_array[vote] += 1 # 输出结果:按照候选人编号从小到大依次打印其得票数 result = [] for i in range(1, n + 1): result.append(str(count_array[i])) print(&#39; &#39;.join(result)) if __name__ == "__main__": main() ``` 上述代码实现了以下功能: - 使用 `sys.stdin.read()` 来读取标准输入中的多行数据[^4]。 - 创建一个大小为 `n+1` 的列表 `count_array`,用于存储每一位候选人的得票情况。其中下标对应候选人编号,初始值均为零。 - 对于每一张选票,如果该选票上的编号在 `[1, n]` 范围内,则将其对应的计数值加一。 - 最终遍历整个 `count_array` 并将结果以空格分隔的形式输出[^3]。 #### 测试样 假设输入如下: ``` 3 6 1 2 3 2 3 2 ``` 程序运行后的输出应为: ``` 1 3 2 ``` 这表示第一位候选人获得了 1 票,第二位候选人获得了 3 票,第三位候选人获得了 2 票。 --- ### 注意事项 为了提高效率,在处理大规模数据时需注意以下几点: - **内存优化**:通过限制变量作用域以及合理分配空间减少不必要的资源消耗。 - **时间复杂度控制**:本方法的时间复杂度接近 O(m),适合当前规模的数据集[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值