PTAt148 学车费用(结构体排序)

时间:2024-03-11 21:42:31

Q1:为什么结构体开大会超时?

Q2:为什么结构体开小会段错误?

题目:

小明学开车后,才发现他的教练对不同的学员收取不同的费用。 小明想分别对他所了解到的学车同学的各项费用进行累加求出总费用,然后按下面的排序规则排序并输出,以便了解教练的收费情况。排序规则: 先按总费用从多到少排序,若总费用相同则按姓名的ASCII码序从小到大排序,若总费用相同而且姓名也相同则按编号(即输入时的顺序号,从1开始编)从小到大排序。

输入格式:

测试数据有多组,处理到文件尾。每组测试数据先输入一个正整数n(n≤20),然后是n行输入,第i行先输入第i个人的姓名(长度不超过10个字符,且只包含大小写英文字母),然后再输入若干个整数(不超过10个),表示第i个人的各项费用,数据之间都以一个空格分隔,第i行输入的编号为i。输入数据和结果均在32位int型范围之内。

输出格式:

对于每组测试,在按描述中要求的排序规则进行排序后,按顺序逐行输出每个人费用情况,包括:费用排名(从1开始,费用相同则排名也相同)、编号、姓名、总费用。每行输出的数据之间留1个空格。

输入样例:

3
Tom 2800 900 2000 500 600
Jack 3800 400 1500 300
Tom 6700 100
 

输出样例:

1 1 Tom 6800
1 3 Tom 6800
3 2 Jack 6000
#include<iostream>
#include<algorithm>
using namespace std;
struct stu{
    string name;int a[1000],index,sum;
};
stu stus[1000];
bool cmp(stu s,stu t){
    if(s.sum!=t.sum)return s.sum>t.sum;
    else if(s.name!=t.name)return s.name<t.name;
    else return s.index<t.index;
}
void run(){
    int n;
    while(cin>>n){
        for(int i=1;i<=n;i++){
            cin>>stus[i].name;int cnt=1;
            stus[i].index=i;stus[i].sum=0;
            while(getchar()!=\'\n\'){
                cin>>stus[i].a[cnt++];
                stus[i].sum+=stus[i].a[cnt-1];
            }
        }
        sort(stus+1,stus+n+1,cmp);
        cout<<1<<\' \'<<stus[1].index<<\' \'<<stus[1].name<<\' \'<<stus[1].sum<<endl;
        int curi=1;
        for(int i=2;i<=n;i++){
            if(stus[i].sum==stus[i-1].sum)cout<<curi<<\' \'<<stus[i].index<<\' \'<<stus[i].name<<\' \'<<stus[i].sum<<endl;
            else{
                cout<<i<<\' \'<<stus[i].index<<\' \'<<stus[i].name<<\' \'<<stus[i].sum<<endl;
                curi=i;
            }
        }
    }
}
int main(){
    run();
    return 0;
}