#include <algorithm> 头文件
以下为对结构体指针所指内容进行排序,sort(a+i,a+n,comp)模板按降序排序
第一、二个参数分别表示起始排序的地址
第三个参数是一个函数名,表示对结构体排序的依据
如果不对指针进行拷贝构造,则排序时会使得原结构体的顺序也会发生改变。
comp指的是配套的一个函数,也就是处理两个结构体时,比较的策略,返回值是bool类型的
以下的例子是在对不同类别学生排序时用到了对结构体的排序
德才论
其实题目的意思就是分为5类人
第0类 不及格,直接淘汰
第一类 最优秀的
第二类 德优秀,才不优秀
第三类 德才都不优秀,但是德比才好些或德与才一样水平
第四类 德不优秀,且才比德好
代码如下:
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct student
{
int id;
int d;
int c;
};
bool comp(student a, student b)
{
if((a.d+a.c)!=(b.d+b.c))
return a.d+a.c>b.d+b.c;
else if(a.d!=b.d)
return a.d>b.d;
else if(a.d==b.d)
return a.id<b.id;
}
//1015 德才论
int main()
{
int n,d1,d2;
cin>>n>>d1>>d2;
student class1[n];
student class2[n];
student class3[n];
student class4[n];
int sum=n;//统计达标人数
int k1=0;
int k2=0;
int k3=0;
int k4=0;
for(int i=0;i<n;i++)
{
int x1,x2,x3;
cin>>x1>>x2>>x3;
if(x2<d1||x3<d1)
sum--;
else if(x2>=d2&&x3>=d2)//第一类 德才兼备
{
class1[k1].id=x1;
class1[k1].d=x2;
class1[k1].c=x3;
k1++;
}
else if((x2>=d2)&&(x2>x3))//第二类 德胜才
{
class2[k2].id=x1;
class2[k2].d=x2;
class2[k2].c=x3;
k2++;
}
else if((x2<d2)&&((x3<d2))&&(x2>=x3))//第三类 德胜才,但才也不大好
{
class3[k3].id=x1;
class3[k3].d=x2;
class3[k3].c=x3;
k3++;
}
else if((x2<d2)&&(x2<x3))//第四类
{
class4[k4].id=x1;
class4[k4].d=x2;
class4[k4].c=x3;
k4++;
}
}
cout<<sum<<endl;
//对第一类进行排序
sort(class1,class1+k1,comp);
for(int i=0;i<k1;i++)
cout<<class1[i].id<<" "<<class1[i].d<<" "<<class1[i].c<<endl;
//对第二类进行排序
sort(class2,class2+k2,comp);
for(int i=0;i<k2;i++)
cout<<class2[i].id<<" "<<class2[i].d<<" "<<class2[i].c<<endl;
//第三类进行排序
sort(class3,class3+k3,comp);
for(int i=0;i<k3;i++)
cout<<class3[i].id<<" "<<class3[i].d<<" "<<class3[i].c<<endl;
sort(class4,class4+k4,comp);
for(int i=0;i<k4;i++)
cout<<class4[i].id<<" "<<class4[i].d<<" "<<class4[i].c<<endl;
return 0;
}