
Problem: 1775. 通过最少操作次数使数组的和相等求出两个的总和若两者差值6修改其中一个即可否则对上界r下界l保证s1更大s2更小可以交换数组和交换总和所以nums1需要减小nums2需要增大的此时求出最大可能减小的分组总和tr求出最大可能增大的分组总和tr2对每种可能的w求出此时的变换次数kk求最小值的不要一个个求用tr , tr2Codeclass Solution { public: int minOperations(vectorint nums1, vectorint nums2) { // [21 10] 15 [6, 36] int n nums1.size(), m nums2.size(); int mi0 n, mi1 m, mx0 n * 6, mx1 m * 6; mi0 max(mi0, mi1); mx0 min(mx0, mx1); if(mi0 mx0) return -1; int s1 0, s2 0; for(int i : nums1) s1 i; for(int i : nums2) s2 i; if(s2 s1) return 0; sort(nums1.begin(), nums1.end()); sort(nums2.begin(), nums2.end()); if(s1 s2) { vectorint tmp nums2; nums2 nums1; nums1 tmp; int t s2; s2 s1; s1 t; } int mid (s2 s1) / 2; int kk 0, mi INT_MAX; if(s1 - s2 6){ n nums1.size(), m nums2.size(); int sub1 s1 - s2; for(int i n-1; i 0; i--) { if(sub1 (nums1[i] - 1)) { kk; break; } else { sub1 sub1 - (nums1[i] - 1); kk; if(sub1 0) break; } } mi min(mi, kk); } kk 0; if(s1 - s2 6){ n nums1.size(), m nums2.size(); int sub2 s1 - s2; for(int i 0; i m; i) { if(sub2 (6 - nums2[i]) ) { kk; break; } else { sub2 sub2 - (6 - nums2[i]); kk; if(sub2 0) break; } } mi min(mi, kk); } vectorint tr(7, 0); int a; for(int i : nums1) { a i - 1; tr[a] a; } vectorint tr2(7, 0); for(int i : nums2) { a 6 - i; tr2[a] a; } int ss1 0, ss2 0; for(int i : tr) ss1 i; for(int i : tr2) ss2 i; int l max({s2 1, mi0}), r min({s1 - 1, mx0}), tp; for(int w l; w r; w) { mid w; kk 0; int sub s1 - mid; int sub2 mid - s2; if(sub ss1) continue; if(sub2 ss2) continue; for(int i 5; i 1; i--){ tp sub; sub - tr[i]; if(sub 0) { kk (tp i - 1) / i; break; } else { kk tr[i] / i; } } if(sub 0) continue; sub2 mid - s2; for(int i 5; i 1; i--){ tp sub2; sub2 - tr2[i]; if(sub2 0) { kk (tp i - 1) / i; break; } else { kk tr2[i] / i; } } if(sub2 0) continue; mi min(mi, kk); } return mi; } };