HDU-6563 Strength (贪心)

int T, n, m;
struct node{
    ll s, v;
}a[N], b[N];

bool cmp(const node&x, const node&y){
    return x.s < y.s;
}

int main()
{
    scanf("%d",&T);
    for(int Case = 1; Case <= T; ++ Case){
        scanf("%d%d",&n,&m);
        int num = 0;
        rep(i,1,n) scanf("%lld",&a[i].s);
        rep(i,1,m) scanf("%lld",&b[i].s);
        rep(i,1,m) {
            scanf("%lld",&b[i].v);
        }
        ll res1 = 0, res2 = 0;
        int l = 1, r = n;
        sort(a + 1, a + n + 1,cmp);
        sort(b + 1, b + m + 1, cmp);
        while(l <= m && r >= 1){
            while(b[l].v && l <= m) l ++;
            if(l > m || b[l].s > a[r].s) break;
            res1 += (a[r].s - b[l].s);
            r --;
            l ++;
        }
        l = m, r = n;
        while(l > 0 || r > 0){
            if(!r) break;
            if(a[r].s < b[l].s){
                res2 = 0;
                break;
            }
            else if(!b[l].v){
                res2 += a[r].s - b[l].s;
            }
            else if(!l) res2 += a[r].s;
            if(l) l --;
            if(r) r --;
        }
        printf("Case %d: %lld\n",Case,max(res1,res2));
    }
    return 0;
}
posted @ 2020-05-12 19:57  A_sc  阅读(202)  评论(0编辑  收藏  举报