数据结构算法(给出两个数组通过计算规则得到数组c)
程序员文章站
2022-06-15 08:46:48
传送门题意: 给出两个只由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,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; }
本文地址:https://blog.csdn.net/Satur9/article/details/108171250
下一篇: 【WPF学习】第六十章 创建控件模板