Senior's Gun
Accepts: 235
Submissions: 977
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
学姐姐是一个酷酷的枪手。 她常常会随身携带 n 把枪,每把枪有一个攻击力 a[i] 。 有一天她遇到了 m 只怪兽,每只怪兽有一个防御力 b[j] 。现在她决定用手中的枪消灭这些怪兽。 学姐姐可以用第 i 把枪消灭第 j 只怪兽当且仅当 b[j]≤a[i] ,同时她会获得 a[i]−b[j] 的分数。 每把枪至多只能使用一次,怪兽死后也不会复活。现在学姐姐想知道她最多能得到多少分(她可以不用消灭所有的怪兽)。
输入描述
第一行包含一个整数 T ,表示测试数据组数。 对于每组测试数据: 第一行包含两个整数 n,m ,表示枪的数量和怪兽的数量。 第二行包含 n 个整数 a[i] ,表示枪的攻击力。 第三行包含 m 个整数 b[j] ,表示怪兽的防御力。 1≤n,m≤100000 , −109≤a[i],b[j]≤109 。
输出描述
对于每组测试数据,输出一个整数表示对应的答案。
输入样例
1 2 2 2 3 2 2
输出样例
1
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100000 + 10
int a[maxn], b[maxn];
int T, n, m;
bool cmp(int a1, int a2)
{
return a1 > a2;
}
int main()
{
cin>>T;
while(T--)
{
scanf("%d%d", &n, &m);
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
for(int i=0; i<m; i++)
scanf("%d", &b[i]);
sort(a, a+n, cmp);
sort(b, b+m);
long long ans = 0;
for(int i=0; i<n; i++)
{
if(a[i]>=b[i] && i<m)
ans += (a[i] - b[i]);
else
break;
}
printf("%I64d\n", ans);
}
return 0;
}
/*
1
4 3
1 2 3 4
3 3 3
4 4
1 2 3 4
0 1 2 3
4 3 2 1
0 1 2 3
*/