HDU 5281
题意:n个射手,第i个射手能力值为a[i],m件物品,第j件物品等级为b[j].
若a[i]>=b[j] 则表示第i个选手能射中第j个物品 并且获得金钱a[i]-b[j].每个物品只有一件 每个射手只能射一次
n,m<=1e5,-1e9<=a[i],b[j]<=1e9.问总共最多能获得多少金钱.
如果知道能选x件物品,不用考虑谁选谁,总的贡献都是一样的为(a[1]+...a[x])-(b[1]+..b[x])
判定是用序列a前x大 去选序列b前x小的即可 然后就WA了...
题意:n个射手,第i个射手能力值为a[i],m件物品,第j件物品等级为b[j].
若a[i]>=b[j] 则表示第i个选手能射中第j个物品 并且获得金钱a[i]-b[j].每个物品只有一件 每个射手只能射一次
n,m<=1e5,-1e9<=a[i],b[j]<=1e9.问总共最多能获得多少金钱.
如果知道能选x件物品,不用考虑谁选谁,总的贡献都是一样的为(a[1]+...a[x])-(b[1]+..b[x])
判定是用序列a前x大 去选序列b前x小的即可 然后就WA了...
本题不是选的越多越好阿 贪心:选的k个中 攻击最小的要大于防御最大的,不然的话 同时舍弃这一组 还是能选k-1个,贡献增加.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll n,m,a[N],b[N];
bool check(int k)
{
for(int i=n,j=1;i>=n-k+1;i--,j++)
{
if(a[i]<b[j])
return false;
}
return true;
}
int main()
{
int T;
cin>>T;
while(T--)
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=m;i