Use greedy algorithm can solve this problem;
The portal:http://acm.hdu.edu.cn/showproblem.php?pid=5281
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
long long a[100005];
long long b[100005];
int cmp1(const void * a1,const void * a2){
long long p1 = *(long long *)a1;
long long p2 = *(long long *)a2;
return p2 - p1;
}
int cmp2(const void * a1,const void * a2){
long long p1 = *(long long *)a1;
long long p2 = *(long long *)a2;
return p1 - p2;
}
void Deal_with(){
int T,n,m;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%lld",a+i);
}
for(int i=0;i<m;i++){
scanf("%lld",b+i);
}
qsort(a,n,sizeof(long long),cmp1);
//Sort a array from higher to lower;
qsort(b,m,sizeof(long long),cmp2);
//Sort b array form lower to higher;
int k = 0;
long long ans = 0;
for(int i=0;i<n;i++){
if(k > m - 1)break;
//I don't add this line that I can't pass the final test in BestCoder;
if(a[i] < b[k])break;
else {
ans += a[i] - b[k++];
}
}
printf("%I64d\n",ans);
}
}
int main(void) {
//freopen("a.in","r",stdin);
Deal_with();
return 0;
}