PAT乙级 1015 德才论+STL模板库之sort()对结构体排序用法

#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; 
}


 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值