这题不难,貌似乙级也有一样的题?简单的排序问题。有一点问题是,用cin,cout绝对超时,查了一下,用一下代码可以加速至与scanf,printf速度一样。
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
好像确实可以加速,但是否能通过还是随缘,pat上最后一个测试点不是固定的,所以一下用c++写的代码有时候不超时有时候超时(以下代码在最后一个测试点最好情况下用时390ms,题目限制400ms,好严格)...主要是c++封装好的string的比较太方便了,c里面又没有这个东西。
超时与否看运气的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include<cstdio> 3 #include<string> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 struct student{ 8 string id,name; 9 int grade; 10 }; 11 bool cmp1(student a,student b){ 12 return a.id<b.id; 13 } 14 bool cmp2(student a,student b){ 15 if(a.name!=b.name) 16 return a.name<b.name; 17 else 18 return a.id<b.id; 19 } 20 bool cmp3(student a,student b){ 21 if(a.grade!=b.grade) 22 return a.grade<b.grade; 23 else 24 return a.id<b.id; 25 } 26 int main() 27 { ios::sync_with_stdio(false); 28 cin.tie(0); 29 cout.tie(0); 30 int n,c; 31 int grade; 32 string id,name; 33 cin>>n>>c; 34 vector<student> stu(n); 35 for(int i=0;i<n;i++){ 36 cin>>stu[i].id>>stu[i].name>>stu[i].grade; 37 } 38 if(c==1) 39 sort(stu.begin(),stu.end(),cmp1); 40 else if(c==2) 41 sort(stu.begin(),stu.end(),cmp2); 42 else 43 sort(stu.begin(),stu.end(),cmp3); 44 for(int i=0;i<n;i++){ 45 46 cout<<stu[i].id<<" "<<stu[i].name<<" "<<stu[i].grade<<endl; 47 } 48 return 0; 49 }
参考了柳神的代码,用c写了一遍,最后一个测试点只用了100多毫秒。c还是更快啊...其实c里面的<cstring>有strcmp(),用起来挺方便的。用c写需要注意,定义字符数组大小要比所接受的字符个数要大一点,比如id有6位,字符数组大小至少定为7,为空字符\0留下空间。同时,注意sort()中的比较函数只返回0,1。strcmp(a,b)有1,-1,0三种返回值。当a<b返回-1,a>b返回1,a=b返回0。升序排序时,比较函数return strcmp(a,b)<0。理解为按照" strcmp(a,b)<0"的方式排序,即按照"a<b"的方式比排序,就是升序。
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 struct student{ 8 char id[7],name[10]; 9 int grade; 10 }; 11 bool cmp1(student a,student b){ 12 return strcmp(a.id,b.id)<0; 13 } 14 bool cmp2(student a,student b){ 15 if(strcmp(a.name,b.name)!=0) 16 return strcmp(a.name,b.name)<0; 17 else 18 return strcmp(a.id,b.id)<0; 19 } 20 bool cmp3(student a,student b){ 21 if(a.grade!=b.grade) 22 return a.grade<b.grade; 23 else 24 return strcmp(a.id,b.id)<0; 25 } 26 int main() 27 { 28 int n,c; 29 int grade; 30 char id[7],name[10]; 31 cin>>n>>c; 32 vector<student> stu(n); 33 for(int i=0;i<n;i++){ 34 scanf("%s %s %d",&stu[i].id,&stu[i].name,&stu[i].grade); 35 } 36 if(c==1) 37 sort(stu.begin(),stu.end(),cmp1); 38 else if(c==2) 39 sort(stu.begin(),stu.end(),cmp2); 40 else 41 sort(stu.begin(),stu.end(),cmp3); 42 for(int i=0;i<n;i++){ 43 printf("%s %s %d\n",stu[i].id,stu[i].name,stu[i].grade); 44 } 45 return 0; 46 }
来源:https://www.cnblogs.com/wsshub/p/12559393.html