东方博宜OJ 1314:仰卧起坐成绩统计 ← 结构体 + 结构体排序

【题目来源】
https://oj.czos.cn/p/1314

【题目描述】
四年级二班女同学在体育课上进行了一轮仰卧起坐测试。成绩计算表如下。

一分钟内做仰卧起坐的个数  成绩
   <20个                  F
  20~29个                 E
  30~39个                 D
  40~49个                 C
  50~59个                 B
  >=60个                  A

请从键盘读入 n 位同学的在一分钟内做仰卧起坐的数量,计算出每个成绩区间的人数,按照人数降序排序,如果有多个成绩区间人数一样多,那么先输出成绩较好的区间。

【输入格式】
第一行是一个整数 n 代表同学的人数(n≤100);
第二行是 n 个同学一分钟完成仰卧起坐的数量。

【输出格式】
输出 6 行为 6 个成绩区间的人数,每行按照“成绩:人数”的格式输出,按照人数降序输出。

【输入样例】
10
19 18 17 20 21 28 30 45 48 51

【输出样例】
E:3
F:3
C:2
B:1
D:1
A:0

【数据范围】
n≤100

【算法分析】
● 本题中,字典序越小的字母,对应的成绩越好。
● 注意“选择结构”的灵活运用。
● 按结构体某一字段对结构体数组进行排序:https://blog.csdn.net/hnjzsyjyj/article/details/120184972

【算法代码】

#include <bits/stdc++.h>
using namespace std;

struct Person {
    int cnt;
    char rnk;
} p[6];

bool cmp(Person x,Person y) {
    if(x.cnt!=y.cnt) return x.cnt>y.cnt;
    return x.rnk<y.rnk;
}

int main() {
    int n;
    cin>>n;
    for(int i=0; i<6; i++) p[i].rnk='A'+i;
    for(int i=0; i<n; i++) {
        int x;
        cin>>x;
        if(x<20) p[5].cnt++;
        else if(x<30) p[4].cnt++;
        else if(x<40) p[3].cnt++;
        else if(x<50) p[2].cnt++;
        else if(x<60) p[1].cnt++;
        else p[0].cnt++;
    }

    sort(p,p+6,cmp);
    for(int i=0; i<6; i++) {
        cout<<p[i].rnk<<":"<<p[i].cnt;
        cout<<endl;
    }

    return 0;
}

/*
in:
10
19 18 17 20 21 28 30 45 48 51

out:
E:3
F:3
C:2
B:1
D:1
A:0
*/





【参考文献】
https://blog.csdn.net/jht0105/article/details/135998672
https://blog.csdn.net/m0_69389639/article/details/146261239



posted @ 2026-01-01 09:30  Triwa  阅读(3)  评论(0)    收藏  举报