acm《班委竞选》

题目描述
某班级中有 n 位学生,学号为 1,2,…,n。现在班级中正在举行 m 个班干部职位的竞选,职位用 1,2,…,m 编号。学号为 i 的同学竞选的职位为 ci,获得 ti 票。最终每个职位选择票数最高的同学上任,若存在多个同学票数一致,则选择学号最小的同学上任。
现在给你唱票结果,请你告诉班主任最终的班干部名单。

输入
第一行包含两个整数 n, m (1≤n≤51, 1≤m≤12, m≤n),含义见题目描述。
接下来 n 行,第 i 行包含两个整数 ci, ti (1≤ci≤m, 1≤ti≤n),含义见题目描述。
数据保证每个职位至少有一位同学参与竞选。

输出
输出一行,包含 m 个整数。第 i 个整数表示担任第 i 个班干部职位的同学学号。

样例输入 Copy
5 2
1 2
2 1
2 1
1 1
2 2

样例输出 Copy
1 5

样例输入二
12 8
8 12
6 8
2 6
1 8
1 7
2 9
3 12
4 9
5 1
6 12
7 6
8 8
样例输出二
4 6 7 8 9 10 11 1
第一个样例中,第 1 个岗位有学号 1 和学号 4 两个同学竞选,获得的票数分别为 2 和 1,第 1 个岗位由获得票数最多的学号 1 同学来担任;第 2 个岗位有学号 2, 3 和 5 三个同学竞选,获得的票数分别为 1, 1 和 2,第 2 个岗位由获得票数最多的学号 5 同学来担任。

代码解析:

#include<stdio.h>
int main(){
	//n表示有几个学生,m表示有几个职位 
	int n,m;
	//数组a的值为记录竞选的职位,下标为第几个学生
	//数组b记录获得的票数,下标为第几个学生 
	//数组c为第 i 个整数表示担任第 i 个班干部职位的同学学号。
	int a[60];
	int b[60];
	int c[60];
	//z 用来作为数组c的下标 
	int z=0; 
	
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
		scanf("%d%d",&a[i],&b[i]);
	}
	//d1记录学号,d2记录获得的票数 
	int d1[60];
	int d2[60];
	//循环遍历a数组把竞选第i职位的同学的学号和选票记录下来
	 for(int i=1;i<=m;i++){
	 	int index=0;
	 	//index当做数组d1,d2的下标 
	 	//循环遍历数组a判断竞选的职位 
	 	for(int j=0;j<n;j++){
	 		if(a[j]==i){
	 			d1[index]=j+1;
	 			d2[index]=b[j];
	 			index++;
			 }
			 
		 }
	 	 //判断竞选第i职位的同学哪个选票最多,用max记录,把max最大的值对应的下标给数组c 
	 	 
		 int max=0; 
		 for(int k=0;k<index;k++){
		 	if(max<d2[k]){
		 		max=d2[k];
		 		c[z]=d1[k];
			 }
		 }
		 //让z+1 
		 z++;
	 }
	 //数组c中储存的都是最大选票的学号,输出数组c即为题目结果
	 for(int i=0;i<m;i++){
	 	printf("%d ",c[i]);
	 } 
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值