本文主要是介绍2018 Multi-University Training Contest 10 hdu 6435 Problem J. CSGO(差值求和最大),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://acm.hdu.edu.cn/showproblem.php?pid=6435
多个属性的差值求和最大值问题。
可以想到最后的答案一定是a1-a2 或者是a2-a1 来组成的,那么我们就可以枚举每个属性前面的符号来取最大值
用状压来实现 1024*n
#include<bits/stdc++.h>
using namespace std;
long long f[111111][7];
long long s[111111][7];
long long fs[111111];
long long ss[111111];
int main(){int t;cin>>t;while(t--){int n,m,k;int jl[6];scanf("%d %d %d",&n,&m,&k);long long ans=-999999999999;int fina=pow(2,k)-1;for(int i=0;i<n;i++){for(int j=0;j<=k;j++)scanf("%lld",&f[i][j]);}for(int i=0;i<m;i++){for(int j=0;j<=k;j++)scanf("%lld",&s[i][j]);}for(int i=0;i<=fina;i++){int zs=i;for(int j=0;j<k;j++){if(zs%2==0)jl[j]=-1;else jl[j]=1;zs=zs/2;}long long mif=-999999999999;long long mis=-999999999999;for(int j=0;j<n;j++){fs[j]=f[j][0];for(int q=0;q<k;q++){fs[j]=fs[j]+f[j][q+1]*jl[q];}mif=max(mif,fs[j]);}for(int j=0;j<m;j++){ss[j]=s[j][0];for(int q=0;q<k;q++){ss[j]=ss[j]+s[j][q+1]*(-jl[q]);}mis=max(mis,ss[j]);}ans=max(ans,mif+mis);}printf("%lld\n",ans);}
}
这篇关于2018 Multi-University Training Contest 10 hdu 6435 Problem J. CSGO(差值求和最大)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!