[1085]. PAT單位排行 (25)

題目:

[1085]. PAT單位排行 (25)

時間限制 500 ms內存限制 65536 kB代碼長度限制 8000 B判題程序 Standard 作者 CHEN, Yue

每次 PAT 考試結束後,考試中心都會發佈一個考生單位排行榜。本題就請你實現這個功能。
輸入格式:
輸入第一行給出一個正整數N(<=105),即考生人數。隨後N行,每行按下列格式給出一個考生的信息:
准考證號 得分 學校
其中“准考證號”是由6個字符組成的字符串,其首字母表示考試的級別:“B”代表乙級,“A”代表甲級,“T”代表頂級;“得分”是 [0,100] 區間內的整數;“學校”是由不超過6個英文字母組成的單位碼(大小寫無關)。注意:題目保證每個考生的准考證號是不同的。
輸出格式:
首先在一行中輸出單位個數。隨後按以下格式非降序輸出單位的排行榜:
排名 學校 加權總分 考生人數
其中“排名”是該單位的排名(從1開始);“學校”是全部按小寫字母輸出的單位碼;“加權總分”定義爲“乙級總分/1.5 + 甲級總分 + 頂級總分*1.5”的整數部分;“考生人數”是該屬於單位的考生的總人數。
學校首先按加權總分排行。如有並列,則應對應相同的排名,並按考生人數升序輸出。如果仍然並列,則按單位碼的字典序輸出。
輸入樣例:
10
A57908 85 Au
B57908 54 LanX
A37487 60 au
T28374 67 CMU
T32486 24 hypu
A66734 92 cmu
B76378 71 AU
A47780 45 lanx
A72809 100 pku
A03274 45 hypu
輸出樣例:
5
1 cmu 192 2
1 au 192 3
3 pku 100 1
4 hypu 81 2
4 lanx 81 2

思路:

顯而易見,這種認家門的數據是要用map來處理;
首先我們要做的就是把school給全部小寫化,然後存入map裏面,這道題我會建兩個map一個是用來存每個學校的總成績的mapp1,另一個是用來存學校參賽的人數mapp2,由於他是要進行排序的,map的自動排序主要是針對key的值進行排序,所以我們要建一個結構體的動態數組把兩個map統計後的數據結合起來再進行排序

注意:

這裏的輸出要用printf,如果用cout會超時(彷彿又聽到老大的怒吼,你爲什麼不用printf?)

C++代碼如下:

#include"iostream"
#include"map"
#include"vector"
#include"algorithm"
#include"cstdio"
using namespace std;
typedef struct student
{
    string name;
    int score;
    int num;    
}ST;
bool cmp(ST a,ST b)
{
    return a.score==b.score?(a.num==b.num?a.name<b.name:a.num<b.num):a.score>b.score;
}
int main()
{
    int n;
    cin>>n;
    int i;
    string id;
    double score;
    string school;
    map<string,double> mapp1;
    map<string,int > mapp2;
    int j;
    for(i=0;i<n;i++)
    {
        cin>>id>>score>>school;
        for(j=0;j<school.size();j++)
        {
            school[j]=tolower(school[j]);//score要先用double,因爲在沒有全加完以前萬一有兩個答案是有.5的那在int狀態下就少了1
                                        //tolower將大寫字母轉換爲小寫字母,toupper將小寫字母轉換爲大寫字母 
        }
        mapp2[school]++;
        if(id[0]=='B')
        {
            mapp1[school]+=score/1.5;
        } 
        else if(id[0]=='T')
        {
            mapp1[school]+=score*1.5; 
        } 
        else if(id[0]=='A')
        {
            mapp1[school]+=score; 
        }
    }
    vector<ST> ss;
    for(map<string,double>::iterator it=mapp1.begin();it!=mapp1.end();it++)
    {
        ss.push_back(ST{it->first,(int)it->second,mapp2[it->first]});
    }
    sort(ss.begin(),ss.end(),cmp);
    int flag=1;
    cout<<ss.size()<<endl;; 
    for(i=0;i<ss.size();i++)
    {
        if(!i||ss[i].score==ss[i-1].score)
//      cout<<flag<<" "<<ss[i].name<<" "<<ss[i].score<<" "<<ss[i].num<<endl;
        printf("%d %s %d %d\n",flag,ss[i].name.c_str(),ss[i].score,ss[i].num);
        else if(i&&ss[i].score!=ss[i-1].score)
        {
            flag=i+1;
//          cout<<flag<<" "<<ss[i].name<<" "<<ss[i].score<<" "<<ss[i].num<<endl;
            printf("%d %s %d %d\n",flag,ss[i].name.c_str(),ss[i].score,ss[i].num);//因爲string的形式printf是不能輸出的,所以你可以使用.c_str()就像我上面寫的,或者你也可以單獨挑出來用cout輸出
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章