2020年河南省第二届CCPC大学生程序设计竞赛 A.班委竞选
//A:班委竞选
//时间限制: 1 Sec 内存限制: 128 MB
//题目:
//某班级中有 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 同学来担任
//分析
//1.主函数内定义三个数组,下标为学号-1,分别存放每个学生竞争职位号和票数,担任各个职位的学生的学号
//2.输入学生数,职位数
//3.for循环输入每个学生竞争职位号,票数,存入数组a,b
//4.定义数组d,e,暂存竞争某个职位的学生的学号和票数以方便比较后求得该职位对应最大票数和对应的学号
//5.for循环求出每个职位票数最多同学的学号并输出(循环m次)
//6.for{int index=0;for{}}
//for循环内定义变量index暂存当前数组d,e的下标并嵌套for循环,执行n次,将数组a内元素值等于本次循环职位号的学生学号(j+1)和相应票数暂存数组d,e
//每次新存入一个同学,下标index就自增1,顺便确定下一步比较票数所需循环次数
//7.for{int index=0;for()int max=0;for()}
//再次定义变量max并嵌套for循环比较max与数组e中的元素,若max小,则将元素值赋值给max,对应的数组d内的学号赋值给c[i-1]
//8.循环输出数组c内m个元素
#include <stdio.h>
int main() {
int n, m; //学号,职位号
int a[60];//(学号-1)做下标,值为学生竞争的职位号(输入)
int b[60];//(学号-1)做下标,值为学生所得票数(输入)
int c[60];//(职位号-1)做下标,值为担任职位的学生号
//输入学生数,职位数,将每个学生对应的职位号和票数输入到数组a和b
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d%d", &a[i], &b[i]);//i为下标故i循环初值为0
}
//数组d和数组e暂存竞选某个职位的所有学生的学号和票数,职位号循环递增,数组元素(竞选循环变化的职位的学生的学生号和票数)也循环更新
int d[60];//竞选某个职位的学生学号(暂存并循环更新)
int e[60];//竞选某个职位的学生票数(暂存并循环更新)
for (int i = 1; i <= m; i++) {
//循环m次,求出每个职位票数最多同学的学号
//循环n次,求出竞选该职位的学生学号和票数
int index = 0; //数组d和数组e的下标,侧面反应该职位的竞选人数以及求对应数组e中最大值需要的比较次数(for循环次数)
for (int j = 0; j < n; j++) {
//从数组a和b找出n个同学中竞选i职位的学号和票数暂存至数组d和e
if (a[j] == i) { //n个数组元素要与该职位号比较,数组元素“下标”从0开始,故j循环初值为0,职位号从1开始,故i循环初值为1
d[index] = j + 1; //下标为学号-1,故学号为j+1
e[index] = b[j];
index++;//下标初值为0,若有人竞选i职位,下标就自加1,自加后的下标值即竞选人数
}
}
//循环index次,求出竞选该职位票数最多学生的学号
int max = 0; //数组e中最大值,初值为0
for (int k = 0; k < index; k++) {
if (max < e[k]) {
//k为下标,故k循环初值从0开始
max = e[k];
c[i - 1] = d[k];
}
}
}
for (int i = 0; i < m; i++) {
printf("%d ", c[i]);
}
return 0;
}