multi-university contest10
multi-university contest10
CSGO
将最大的值表示为$abs(x_i-x_j) = max(x_i, x_j, x_j, x_i)$
然后枚举$2^k种$状态,每种符号的状态确定一个最大值,然后最大值相加,当然也就是最大的值了。
ac code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include <bits/stdc++.h> using namespace std; typedef long long ll; ll a[64], b[64], ans; const int inf = 2e9; int n, m, K; ll x[6]; int main() { ios::sync_with_stdio(false); int _; cin>>_; while(_--){ cin>>n>>m>>K; for(int i=0; i<64; i++) a[i] = b[i] = -inf; for(int i=0; i<n; i++){ ll val; cin>>val; ll sum = val; for(int j=0; j<K; j++){ cin>>x[j]; } for(int s=0; s<(1<<K); s++){ sum = val; for(int j=0; j<K; j++){ if(((s>>j)&1) == 0) sum -= x[j]; else sum += x[j]; } a[s] = max(a[s], sum); } } for(int i=0; i<m; i++){ ll val; cin>>val; ll sum = val; for(int j=0; j<K; j++){ cin>>x[j]; } for(int s=0; s<(1<<K); s++){ sum = val; for(int j=0; j<K; j++){ if(((s>>j)&1) == 0) sum -= x[j]; else sum += x[j]; } b[s] = max(b[s], sum); } } ans = -1; for(int i=0; i<(1<<K); i++){ ans = max(ans, a[i]+b[(1<<K)-1-i]); } cout<<ans<<endl; } return 0; }
|
未解决的问题