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
发现还是真真正正的比赛锻炼思考的能力,就算是一些小型的比赛。头脑要保持冷静啊光速小子,cmp也写错,关键是还加进了两个sort里面,你当时的头 是有多混乱你告诉我。。。
这题就是贪心,用最狠的武器挑最软的柿子捏啊,没什么好说的。整个贪一遍,就AC了。。。就这么简单。。。也不要总把第二题想象得有多难。。。。。
代码:
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int a[100005];
int b[100005];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int Test;
int gun_num,guai,i,j;
long long ans;
cin>>Test;
while(Test--)
{
ans=0;
cin>>gun_num>>guai;
for(i=1;i<=gun_num;i++)
cin>>a[i];
for(i=1;i<=guai;i++)
cin>>b[i];
sort(a+1,a+gun_num+1,cmp);
sort(b+1,b+guai+1);
i=1;j=1;
while(i<=gun_num&&j<=guai)
{
if(a[i]-b[j]>0)
ans += a[i]-b[j];
i++;
j++;
}
cout<<ans<<endl;
}
return 0;
}