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.