给定 n 个整数 a1,a2,…,an,n 为偶数。
现在要将它们两两配对,组成 n/2 个数对。
ai 和 aj 能够配对,当且仅当 ai=aj。
每次增加操作可以使其中的任意一个数 ai 加一。
请问,要使得 n 个整数能够成功组成 n2 个数对,至少要进行多少次增加操作。
输入格式
第一行包含整数 n。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
一个整数,表示所需最少操作次数。
数据范围
1≤n≤10^5,
1≤ai≤10^4
输入样例1:
6
5 10 2 3 14 5
输出样例1:
5
输入样例2:
2
1 100
输出样例2:
99
思路:首先先想到贪心,手算了一下符合结果,试着提交结果ac
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int nums[N];
int main(){
int n;
int ans=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>nums[i];
}
sort(nums,nums+n);
for(int i=0;i<n;i+=2){
ans+=nums[i+1]-nums[i];
}
cout<<ans<<endl;
return 0;
}
证明:之所以难度是中等是在于其证明
假设a,b,c,d有序,A为贪心法,B为最优解
首先很很明显A<=B
其次B有以下其他情况
通过红色线的调整可以证明A<=B
通过以上论证,证明A==B即最优解是贪心法