#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int a[N];
int main()
{
scanf("%d", &n);
LL res = 0;
for (int i = 0; i < n; i ++ )
scanf("%d", &a[i]);
sort(a, a+n);
for (int i = 0; i < n; i+=2 )
res += a[i+1] - a[i];
cout<<res<<endl;
return 0;
}
目前想到了一个反证法的证明。
如果最开始是1,100两个数,结果是99.
如果中间插入两个数字(已经排序好的)1,98,99,100. 那么如果不是用res += a[i+1] - a[i]的结果来做的话,用(100-1) + (99-98), 结果等于100。
而如果使用res += a[i+1] - a[i]的话,结果为(98-1) + (100-99)等于98。因此解不可能是除此以外的方法。
再丰富一下通解,
设四个数,且不妨设
a1=a2< a3=a4,有:(a4 - a1) + (a3 - a2) > (a2 - a1) + (a4 - a3)
推导一下为a3 - a1 > 0
接着,设a2 = a1+ 1, a4 = a3+1,且满足a3>=a2(a3一定比a1大1)
那么(a4 - a1) + (a3 - a2) = 2(a3 - a1)
因为a1 和 a3的值不变,恒有(a3-a1)>0,并且因为都是整数,a3-a1>=1,
因此2(a3-a1)>=2
再计算一下新的(a2-a1) + (a4 - a3) = 2,因此,(a4 - a1) + (a3 - a2) > (a2 - a1) + (a4 - a3)还是成立的。
接下来a2和a4分别大2,大3,.....,大n,只要满足a1<=a2<=a3<=a4,(a4 - a1) + (a3 - a2) > (a2 - a1) + (a4 - a3)就恒成立。(大的数字不相同,也成立)
重点就是因为都是整数,所以只要大,一定大1,乘以2后,会比右侧差值大。