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 }