题目描述
某学校的某次考试成绩以等第形式出现的,每名学生的成绩都是ABCD 中的一个。
学校有 n 个班级,小爱想根据这次考试中 A
的比例,从高到低为这些班级排序;若出现两个班级 A
的比例相同,就按 B
的比例从高到低排序;若再相同,就按照 C
的比例;若再相同,就按照班级人数从大到小排序;若再相同,就按照班级编号从小到大排序。
请帮助小爱完成这个任务。
输入格式
第一行:单个整数 n。
第二行到第 n+1 行:第 i+1行有一个字符串,表示第 i 个班级的学生成绩,每个字符代表一个学生的成绩。
输出格式
只有一行:按照班级排名先后顺序输出 n 个整数,每个整数代表一个班级的编号。
数据范围
- 对于 50% 的数据,1≤n≤100;
- 对于 100%的数据,1≤n≤10000,且每个班级人数不超过 100 人。
样例1
输入:
3
ABAACAA
DDABBB
BABABA
输出:
1 3 2
说明:1班的A比例最高,3班第二,2班最低
样例2
输入:
3
ABCD
ABCDABCD
AABBCCDD
输出:
2 3 1
说明:2班3班各项分数比例相同且人数高于1班
题解在此:
#include<bits/stdc++.h>
using namespace std;
struct node{
float a,b,c;
int stu,num;
}cl[10005];
bool cmp(node n,node m){
if(n.a!=m.a)return n.a<m.a;
if(n.b!=m.b)return n.b<m.b;
if(n.c!=m.c)return n.c<m.c;
if(n.stu!=m.stu)return n.stu>m.stu;
return n.num<m.num;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
string s;
cin>>s;
cl[i].num=i;
cl[i].stu=s.length();
for(int j=0;j<s.length();j++){
if(s[j]=='A')cl[i].a+=1;
else if(s[j]=='B')cl[i].b+=1;
else if(s[j]=='C')cl[i].c+=1;
}
cl[i].a=cl[i].stu/cl[i].a;
cl[i].b=cl[i].stu/cl[i].b;
cl[i].c=cl[i].stu/cl[i].c;
}
sort(cl+1,cl+n+1,cmp);
for(int i=1;i<=n;i++)cout<<cl[i].num<<" ";
return 0;
}
考试排名https://iai.sh.cn/problem/429
标签:YACS,班级,cl,int,stu,num,排名,排序,考试 From: https://blog.csdn.net/ZYZQAQ_C/article/details/140874100