2019 问题 G: Rabbit 的考研之路

题目描述
大三的 Rabbit 已经开始考研了,她需要参加数学、英语、政治、专业课四门

考试,四门课的满分分别是 150,100,100,150。

不过她了解到考研与普通考试不同,要想被录取不仅要总分到达国家线(320 分),而且单科成绩也必须到达单科线。 这里每门课的单科线为这门课满分的 60%。

过了几个月,考研成绩出来了,Rabbit 得到了班上所有 N 位同学的成绩,现 在她想知道哪些同学能被录取,并根据她们的总分从大到小排序(若总分相同, 则按照名字的字典序从小到大排序)。

注:到达指的是大于等于,数据保证学生名字是只由小写字母和大写字母组 成的不同字符串,且至少有一位同学能被录取。

输入
输入数据第一行为 T,表示数据组数。(1<=T<=20)

每组数据第一行为 N,表示学生人数。(1<=N<=100)

接下来 N 行,每行首先是一个字符串 S,表示第 i 个学生的名字,接下来四个 整数 M,E,P,Z,分别表示该学生的数学成绩,英语成绩,政治成绩,专业课成绩。 (1<=|S|<=10,1<=E,P<=100,1<=M,Z<=150)

输出
对于每组数据输出若干行,每行输出被录取的学生按照成绩排序后的名字和 总分,用空格隔开。
样例输入

1
3
Bob 105 70 65 110
John 135 55 70 120
Tom 100 75 70 120

样例输出

Tom 365
Bob 350

刚开始直接用数组,但是老是不过,只好先换成了结构体,还学了一手结构体排序。。。

#include <iostream>
#include <algorithm>
using namespace std;
struct A{
    string s;
    int sum;
};
 
bool cmp(A a,A b)
{
    if(a.sum == b.sum)
    {
        return a.s <b.s;
    }
    return a.sum > b.sum;
}
 
int main()
{
 
    int t;
    cin>>t;
    while (t--)
    {
        int n;
        A x[1005];
        int ji=0;
        cin>>n;
        for(int i=0; i<n; i++)
        {
            int score[4];
            string name;
            cin>>name>>score[0]>>score[1]>>score[2]>>score[3];
            int sum = score[0] + score[1] + score[2] + score[3] ;
            if( score[0]>=90 && score[1]>=60 && score[2]>=60 && score[3]>=90 && sum >= 320 )
            {
                x[ji].s = name;
                x[ji].sum = sum;
                ji++;
            }
        }
        sort(x, x + ji, cmp);
        for(int i=0;i<ji;i++)
        {
            cout<<x[i].s<<" "<<x[i].sum<<endl;
        }
    }
    return 0;
}

服了呀,过几天再看发现仅仅因为判断时候丢了一个‘=’。。。导致两组数据不输出。。。

#include<iostream>
using namespace std;
int main(){
    int t,ji=0;
    cin>>t;
    string s,s1[1005];int a[4],sum[1005];
    while(t--){
        int n;
        cin>>n;
        int sum1=0;
        ji=0;
        for (int k = 0; k < n; k++) {
            sum1 = 0;
            cin >> s;
            for (int j = 0; j < 4; j++) {
                cin >> a[j];
                sum1 += a[j];
            }
            if ((a[0] >= 90) && (a[1] >=60)&& (a[2] >=60)&& (a[3] >=90) && (sum1 >= 320)) {
                s1[ji] = s;
                sum[ji] = sum1;
                ji++;
            }
        }
        int temp;
        string te;
        for (int m = 0; m < ji - 1; m++) {
            for (int p = m + 1; p < ji; p++) {
                if (sum[p] > sum[m]) {
                    temp = sum[p];
                    te = s1[p];
                    sum[p] = sum[m];
                    s1[p] = s1[m];
                    sum[m] = temp;
                    s1[m] = te;
                }
            }
        }
        for (int m = 0; m < ji - 1; m++) {
            for (int p = m + 1; p < ji; p++) {
                if(sum[p]==sum[m]){
                    if(s1[p]<s1[m]){
                        temp = sum[p];
                        te = s1[p];
                        sum[p] = sum[m];
                        s1[p] = s1[m];
                        sum[m] = temp;
                        s1[m] = te;
                    }
                }
            }
        }
        for (int k = 0; k < ji; k++) {
            cout << s1[k] << " " << sum[k]<<endl;
        }
    }
}

直接排序可以,时间不会有问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值