1085 PAT单位排行

再次做这道题,收获很多!!!

新技巧get!!!保留结构体的默认构造函数,并构造新的构造函数,用于快速初始化结构体。

 

用法:结构体名(参数1,参数2,参数3,。。。)

 1 #include<iostream>
 2 #include<unordered_map>
 3 #include<vector>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 struct School {
 8     string name;//学生名称
 9     int ts = 0,cnt = 0;//加权总分,考生人数
10     School() {}; //常常用于不经初始化就定义 关于结构体类型的静态数组,因为这里使用了动态数组,所以其实可以忽略这个构造函数 
11     School(string _name,int _ts,int _cnt) :name (_name),ts(_ts),cnt(_cnt) {} //用于快速初始化的构造函数
12 } ;
13 
14 bool cmp(const School& a,const School& b) {
15     if(a.ts != b.ts) return a.ts > b.ts;
16     if(a.cnt != b.cnt) return a.cnt < b.cnt;
17     return a.name < b.name;
18 }
19 int main() {
20     int n;
21     cin>>n;
22     unordered_map<string,int> cnt;
23     unordered_map<string,double> sum;
24     while(n--) {
25         string id,name;
26         double grade;
27         cin>>id>>grade>>name;
28         for(int i = 0; i < name.size(); ++i)//校名转小写
29             name[i] = tolower(name[i]);
30         if(id[0] == 'B') grade /= 1.5;
31         else if(id[0] == 'T') grade *= 1.5;
32         sum[name] += grade;
33         cnt[name] += 1;
34     }
35     vector<School> vs;
36     for(auto it = sum.begin(); it != sum.end(); ++it) { //利用构造函数 给School赋值
37         vs.push_back(School (it->first,(int)sum[it->first],cnt[it->first]));
38     }
39     sort(vs.begin(),vs.end(),cmp);
40     int Rank = 1;
41     printf("%d\n",sum.size());
42     for(int i = 0; i < vs.size(); ++i) {
43         if(i > 0 && vs[i].ts != vs[i-1].ts)
44             Rank = i+1;
45         printf("%d %s %d %d\n",Rank,vs[i].name.c_str(),vs[i].ts,vs[i].cnt);
46     }
47     return 0;
48 }

 

posted @ 2020-02-25 22:09  tangq123  阅读(151)  评论(0编辑  收藏  举报