HDU 多校 6435 Problem J. CSGO(思维

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ffgcc/article/details/81951339

解析:
共有k维,每一维度仅有2个状态,所以一共有2^k个状态
枚举每个状态,
n和m是独立存在的,
所以在此状态下对n和m分别取最大值即可

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+100;
ll T,n,m,k,ar[N][10],ap[N][10],s1[N],s2[N],inf=2e18;
int main()
{
    #ifdef local
        freopen("D://r.txt","r",stdin);
    #endif
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld%lld%lld",&n,&m,&k);
        for(ll i=0;i<n;i++){
            scanf("%lld",&s1[i]);
            for(ll j=0;j<k;j++)
                scanf("%lld",&ar[i][j]);
        }
        for(ll i=0;i<m;i++){
            scanf("%lld",&s2[i]);
            for(ll j=0;j<k;j++)
                scanf("%lld",&ap[i][j]);
        }
        ll s=1<<k,mx=-inf,t;
        for(ll i=0;i<s;i++){
            ll mx2=-inf,mx1=-inf;
            for(ll j=0;j<n;j++){ t=s1[j];
                for(ll q=0;q<k;q++){
                    if((1<<q)&i)  t+=ar[j][q];
                    else t-=ar[j][q];
                } mx2=max(mx2,t);
            }
            for(ll j=0;j<m;j++){ t=s2[j];
                for(ll q=0;q<k;q++){
                    if((1<<q)&i) t-=ap[j][q];
                    else t+=ap[j][q];
                } mx1=max(mx1,t);
            } mx =max(mx,mx1+mx2);
        }
        printf("%lld\n",mx);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ffgcc/article/details/81951339
今日推荐