传送门
题意: 给出两个只由0,1,2组成的数组a,b;可通过一种计算规则得到相应的数组c:
- c[i] = a[i]*b[i] , a[i] > b[i]
- c[i] = 0 , a[i] == b[i]
- c[i] = -a[i]*b[i], a[i] < b[i]
现可将a,b进行特定的排序,使得sum©得到最大值,并求出该max。
思路:
- 正贡献(+2)的情况,a[i] > b[i],那么就要认a中的2尽量多的对应b的1.
- 无贡献的情况,a[i]为0或b[i]为0,所以让a的0尽量多的对应b的2,消耗掉b中的大元素。
- 负贡献(-2)的情况,最后若还有避免不了的a中的1和b中的2相对应,那就再加上这些负贡献。
代码实现:
#include<bits/stdc++.h>
#define endl '\n'
#define null NULL
#define ll long long
#define int long long
#define pii pair<int, int>
#define lowbit(x) (x &(-x))
#define ls(x) x<<1
#define rs(x) (x<<1+1)
#define me(ar) memset(ar, 0, sizeof ar)
#define mem(ar,num) memset(ar, num, sizeof ar)
#define rp(i, n) for(int i = 0, i < n; i ++)
#define rep(i, a, n) for(int i = a; i <= n; i ++)
#define pre(i, n, a) for(int i = n; i >= a; i --)
#define IOS ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int way[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
using namespace std;
const int inf = 0x7fffffff;
const double PI = acos(-1.0);
const double eps = 1e-6;
const ll mod = 1e9 + 7;
const int N = 2e5 + 5;
int t, n, x1, y1, z1, x2, y2, z2;
signed main(){
IOS;
cin >> t;
while(t --){
cin >> x1 >> y1 >> z1;
cin >> x2 >> y2 >> z2;
int ans = 0;
int cnt1 = min(z1,y2);
ans += cnt1*2;
z1 -= cnt1; y2 -= cnt1;
int cnt2 = min(x1,z2);
x1 -= cnt2; z2 -= cnt2;
if(z2 && z1 < z2) ans -= (z2-z1)*2;
cout << ans << endl;
}
return 0;
}