HDU 多校 6435 Problem J. CSGO(思维
解析:
共有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;
}