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++){
// cout<<a[i]<<" "<<b[i]<<endl;
// }
// cout<<endl<<endl;
for(int i=0; i<(1<<K); i++){
ans = max(ans, a[i]+b[(1<<K)-1-i]);
}
cout<<ans<<endl;
}
return 0;
}
/*
2
2 2 1
0 233
0 666
0 123
0 456
2 2 1
100 0
1000 100
1000 100
100 0
*/

未解决的问题

文章目录
  1. 1. CSGO
    1. 1.1. ac code
  2. 2. 未解决的问题
{{ live2d() }}