当数组a是递增排序,而数组b是递减排序时;或者数组a是递减排序,而数组b是递增排序时,结果最大。首先,这两种情况呈现一个对称关系,不妨证明前者——当数组a是递增排序,而数组b是递减排序时,结果最大。
证明以下不等式:a1≥a2,b1≤b2时,有|a1-b1|+|a2-b2|≥|a1-b2|+|a2-b1|
先讨论数字相等的情况,四个数字至少有两个相等,分成以下几类:a1=a2,b1=b2;a1=a2,b1≠b2;a1≠a2,b1=b2;a1=b1=a2=b2等等,这些都非常容易证明
再证明四个数字互不相等的情况,一共有以下几类:b1<b2<a2<a1;b1<a2<b2<a1;b1<a2<a1<b2;a2<b1<b2<a1;a2<b1<a1<b2;a2<a1<b1<b2,采用作图法进行证明,在数轴上描出这些点即可判断
2.设数组a是递增排序,则数组b是递减排序时,结果最大
若数组b是常数数组,无论什么排序,结果都一样
若数组b不是常数数组,假设数组b不在递减排序下取得最大结果,由于数组b不是递减排序,因此会出现数组b的某个数字b1排在某个数字b2的前面,而且b1≥b2,交换这两个数字得到数组b的一个新排序,由结论1,会使结果值增大,矛盾。因此,
参考代码:
#include<algorithm> #include<stdlib.h> #include<stdio.h> using namespace std; int main() { int n; scanf("%d",&n); int *a=(int *)malloc(n*sizeof(int)),*b=(int *)malloc(n*sizeof(int)); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) scanf("%d",&b[i]); sort(a,a+n); sort(b,b+n); int num=0; for(int i=0;i<n;i++) num=num+abs(a[i]-b[n-1-i]); printf("%d",num); }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复