HDU 5281 Senior's Gun 贪心

来源:互联网 发布:网络媒介的演变 编辑:程序博客网 时间:2024/05/17 05:12
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了...

本题不是选的越多越好阿 贪心:选的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++)            scanf("%lld",&b[i]);        sort(a+1,a+1+n);        sort(b+1,b+1+m);        int l=0,r=min(n,m);        while(l<=r)        {            int mid=l+r>>1;            if(check(mid))                l=mid+1;            else                r=mid-1;        }        int k=l-1;        ll ans=0;        for(int i=1;i<=k;i++)            ans-=b[i],ans+=a[n-i+1];        printf("%lld\n",ans);    }    return 0;}


原创粉丝点击