洛谷P1271 【深基9.例1】选举学生会进阶解法

#include<iostream>
#include<algorithm>
const int MAX = 2000000;

using namespace std;
int n, m,ticket[MAX];

int main()
{
	cin >> n >> m;
	for (int i = 0; i < m; i++)
		cin >> ticket[i];
	sort(ticket, ticket + m);
	for(int i=0;i<m;i++)
		cout<<ticket[i]<<' ';
	return 0;
}
### 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值