对sort自定义函数排序结构体数组的一些反思 10.17

ak杯网络赛赛题:

 分析题目 典型的每个数据都要附加一个数据

  在这里表现为每道菜都应该绑定住自己的序号以及其他的附加信息,比如ai和bi的差值等等

  所以遇到这种绑定数据更容易做的题目时候应该优先想到用结构体去做,每个结构体保存一定的数据,最后写成结构体数组的形式;

struct kk
{
	int a=0;
	int b=0;//b对应一列下来的第二个数据
	int loca=0;
	int cha;//定义多一个差值绑定数据
};

然后分别输入菜的数据,并且确定每道菜的abs(ai-bi)以及对应序号,还有ai*bi

kk cai[1001];
	kk caiji[1001];
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)	
		cin >> cai[i].a;

	for (int i = 0; i < n; i++)
		cin >> cai[i].b;

	for (int i = 0; i < n; i++)
	{
		cai[i].loca=i+1;
		caiji[i].loca = i + 1;
		caiji[i].a = cai[i].a*cai[i].b;
		caiji[i].cha = abs(cai[i].a - cai[i].b);
	}

输入数据以后自然就要考虑对整合的caiji (菜积)排序 

那么就引出一个关键问题 如何设定自己想要的排序规则对结构体数组进行排序呢?

这里手写规则固然可以 但是可以用stl里面的sort来处理

自定义cmp函数进行规则排序

bool cmp(kk m1, kk m2)
{
	if(m1.a!=m2.a)
	return m1.a < m2.a;

	return m1.cha < m2.cha;
}

这里的意思是对m1.a排升序,并且当m1.a相等的时候对m1.cha进行排序

输入以下数据点:

7
20 24 0 8 58 9 2
29 3 999 9 10 8 7

未排序之前输出的东西:

排序以后输出的东西:

 可以很清晰的看到 首先是caiji这个数据被正常的升序排列,同时在三个72的情况出现的时候

把差值进行升序排列,那么差值的绝对值最小的也就是72 4 这组数据就是我们想要的东西,接下来想办法输出这个就行了

那么cmp的实质是什么呢?

如果写了  return m1.a < m2.a;

如果认为第一个参数比第二个小,也就是第一个参数需要排在第二个参数前面时返回true,反之返回 false。系统默认a<b时返回true,于是从小到大排。

同理大于号的时候也是这个原理

     解决完这个问题以后,接下来判断数组中第二大的数输出,如果没有第二大的数那么就打出soldout.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值