描述
我国的高考志愿投档是严格按照高考分数从高到低的顺序排列,排列的规则如下:首先按照总分降序排列;当总分相同时,再按照语文分数降序排序;当语文分数也相同时,再按照数学分数降序排序;当数学分数也相同时,再按照英语分数降序排序。所有分数都相同时,再按照录入的顺序排列。这样,每个考生的位序都是唯一的。
现在给定n(10≤n≤1000)个人的有关信息,按照上述规则排序之后,输出最前面的m(1≤m≤n)个人的序号。
例如有10个人的成绩(每一行依次是语、数、外成绩;学生的序号从1开始,就是他所在的行数)如下:
73 76 78
74 77 77
71 79 79
75 74 77
71 72 70
71 75 79
79 74 73
73 75 74
73 70 79
77 79 70
正确的排序结果如下:
3 2 1 7 10 4 6 8 9 5
再比如有10个考生的成绩如下:
66 60 63
61 63 60
63 65 60
69 60 60
64 68 69
68 62 63
63 67 67
69 68 61
65 60 65
62 65 65
排序结果如下:
5 8 7 6 10 9 4 1 3 2
格式
输入格式
第一行是两个整数n和m,表示后续有n个考生的信息,要求输出m个考生的序号。从第2行到n+1行,每行一个考生的信息,依次是:语文分、数学分、英语分。 注意:学生的序号从1开始计数,就是它所在的行号减一
输出格式
输出m个整数,表示排序后的前m个考生的序号,整数之间用空格分隔
代码
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b); //输入
int k[a][3];
for(int i=0;i<a;i++){
scanf("%d%d%d",&k[i][0],&k[i][1],&k[i][2]); //输入
}
int sum[a];
for(int i=0;i<a;i++){
sum[i]=k[i][0]+k[i][1]+k[i][2]; //求每个考生的成绩之和
}
int aa[a];
for(int i=0;i<a;i++){ //用于存放每个考生的成绩
aa[i]=0;
}
int cent=1; //用于记录考生的名次并存放在aa中
for(int i=0;i<a;i++){ //从第一个考生开始到最后一个
cent=1; //重置
for(int j=0;j<a;j++){ //将a[i]这个考生于所有考生进行比较
if(sum[i]<sum[j]){ //分数小于其他的考生,名次cent++
cent++;
}else if(sum[i]==sum[j]){ //总分数相等,依次比较其他成绩,如果都相等,比较输入的次序
if(k[i][0]<k[j][0]){
cent++;
}else if((k[i][0]==k[j][0])&&(k[i][1]<k[j][1])){
cent++;
}else if((k[i][0]==k[j][0])&&(k[i][1]==k[j][1])&&(k[i][2]<k[j][2])){
cent++;
}else if((k[i][0]==k[j][0])&&(k[i][1]==k[j][1])&&(k[i][2]=k[j][2])&&(i>j)){
cent++;
}
}
}
aa[i]=cent; //赋给名次数组
}
int bb=1; //从第一名开始查找第一名的输入的次序,找到后++,开始找第2名,直到第b名
for(int i=0;i<b;i++){
for(int j=0;j<a;j++){
if(aa[j]==bb){
printf("%d ",j+1);
bb++;
break; //break,已经找到,跳出开始找下一个,保证bb只加一次
}
}
}
}