一个萌新的成长之路
Background
- 在做题过程中,我们常会遇到对双关键字排序的情况,如:当分数相等时,序号小的在前.
-
这时我们可以通过定义cmp函数作为sort的参数进行排序.
Solution
-
定义一个结构体,包含我们所需的关键字。例如,这是一个包含分数,序号和姓名的结构体.
struct node{ int id,score; string name; };
-
实现cmp函数,这里使用了两组不同的关键字.
bool cmp_score_id(node a,node b) { if(a.score==b.score)return a.id<b.id; return a.score>b.score; } bool cmp_score_name(node a,node b) { if(a.score==b.score)return a.name<b.name; return a.score>b.score; }
-
代码如下:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct node{ int id,score; string name; }stu[1000]; bool cmp_score_id(node a,node b) { if(a.score==b.score)return a.id<b.id; return a.score>b.score; } bool cmp_score_name(node a,node b) { if(a.score==b.score)return a.name<b.name; return a.score>b.score; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;++i)//卡常小技巧,++i较i++更快. scanf("%d%d%s",&stu[i].id,&stu[i].score,&stu[i].name); sort(stu+1,stu+1+n,cmp_score_id); for(int i=1;i<=n;++i)printf("%d %d",stu[i].id,stu[i].score); sort(stu+1,stu+1+n,cmp_score_name); for(int i=1;i<=n;++i)printf("%d %s",stu[i].score,stu[i].name); return 0; }
Jan,21,2017 Sun