1095 解码PAT准考证
麻烦的一批!!!还好题目比较耿直,按要求输出即可,超时就换unordered_map。
新学了小玩意STL-pair,可以理解成一个结构体。
struct pair{ typename1 first; typename2 second; };
用途:
1.可以代替二元结构体及其构造函数,节省编码时间。类似 B1085 PAT单位排行。
2.可以作为map的键值对来进行插入。
1 #include"iostream" 2 #include"algorithm" 3 #include"vector" 4 #include"unordered_map" 5 using namespace std; 6 7 struct Student { 8 string id; 9 int grade; 10 } stu[10010]; 11 12 bool cmp1(Student a,Student b) { 13 if(a.grade != b.grade) return a.grade > b.grade; 14 else return a.id < b.id; 15 } 16 17 bool cmp2(pair<string,int> a,pair<string,int> b) { 18 if(a.second != b.second) return a.second > b.second; 19 else return a.first < b.first; 20 } 21 22 int main() { 23 int N,M; 24 scanf("%d%d",&N,&M); 25 for(int i = 0; i < N; ++i) { 26 getchar(); 27 cin>>stu[i].id; 28 scanf("%d",&stu[i].grade); 29 } 30 int type; 31 string ins; 32 for(int i = 1; i <=M; ++i) { 33 scanf("%d",&type); 34 getchar(); 35 cin>>ins; 36 printf("Case %d: %d ",i,type); 37 cout<<ins<<endl; 38 if(type == 1) { 39 sort(stu,stu+N,cmp1); 40 bool flag = false; 41 for(int j = 0; j < N; ++j) { 42 if(ins[0] == stu[j].id[0]) { 43 flag = true; 44 cout<<stu[j].id; 45 printf(" %d\n",stu[j].grade); 46 } 47 } 48 if(flag == false) printf("NA\n"); 49 } else if(type == 2) { 50 int cnt = 0,score = 0; 51 for(int j = 0; j < N; ++j) { 52 if(ins == stu[j].id.substr(1,3)) { 53 cnt++; 54 score+=stu[j].grade; 55 } 56 } 57 if(cnt == 0) printf("NA\n"); //以参加比赛人数为判断条件 58 else 59 printf("%d %d\n",cnt,score); 60 } else { 61 unordered_map<string,int> m; 62 for(int j = 0; j < N; ++j) { 63 if(ins == stu[j].id.substr(4,6)) { 64 m[stu[j].id.substr(1,3)]++; 65 } 66 } 67 if(m.size() == 0) printf("NA\n"); 68 else { 69 //把map中的键值对通过键值对结构体pair插入到vector中 70 vector<pair<string,int>> v(m.begin(),m.end()); 71 sort(v.begin(),v.end(),cmp2); 72 for(int j = 0; j < v.size(); ++j) { 73 cout<<v[j].first; 74 printf(" %d\n",v[j].second); 75 } 76 } 77 } 78 } 79 return 0; 80 }