PTAt148 學車費用(結構體排序)


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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM