classSolution { public: intminZeroArray(vector<int>& nums, vector<vector<int>>& queries){ int n = nums.size(), m = queries.size(); auto check = [&](int mid) -> bool { for (int i = 0; i < n; ++i) { if (nums[i] == 0) continue; unordered_map<int, int> mp; bool f[1001]; memset(f, 0, sizeof(f)); f[0] = 1; for (int j = 0; j < mid; ++j) { int l = queries[j][0], r = queries[j][1], v = queries[j][2]; if (l <= i && i <= r) mp[v]++; } for (auto it : mp) { int val = it.first, cnt = it.second; int j = 1, s = 1; while (s <= cnt) { for (int k = 1000 - val * j; k >= 0; --k) { if (f[k]) f[k + val * j] = 1; } j <<= 1; s += j; } s -= j; if (s <= cnt) { j = cnt - s; for (int k = 1000 - val * j; k >= 0; --k) { if (f[k]) f[k + val * j] = 1; } } } if (!f[nums[i]]) return0; } return1; };
int l = 0, r = m + 1; while (l < r) { int mid = (l + r) >> 1; if (check(mid)) r = mid; else l = mid + 1; } if (l == m + 1) return-1; return l; } };
classSolution { public: intminZeroArray(vector<int>& nums, vector<vector<int>>& queries){ int n = nums.size(), m = queries.size(); auto check = [&](int mid) -> bool { for (int i = 0; i < n; ++i) { int x = nums[i]; if (x == 0) continue; // 统计多重背包 // cnt[v]: 价值v的物品有多少个 int cnt[11]; memset(cnt, 0, sizeof(cnt)); for (int j = 0; j < mid; ++j) { int l = queries[j][0], r = queries[j][1], v = queries[j][2]; if (l <= i && i <= r) cnt[v]++; } // 对每个i执行多重背包, 二进制优化+位运算优化 bitset<1001> f; f[0] = 1; for (int v = 1; v <= 10 && !f[x]; ++v) { int c = cnt[v]; for (int k = 1; c > 0 && !f[x]; k <<= 1) { int mi = min(k, c), w = mi * v; f |= f << w; c -= k; } } if (!f[x]) returnfalse; } returntrue; }; // 二分, 如果最终停留在m + 1上, 说明所有访问序列都没办法变成0 int l = 0, r = m + 1; while (l < r) { int mid = (l + r) >> 1; if (check(mid)) r = mid; else l = mid + 1; } if (l == m + 1) return-1; return l; } };
classSolution { public: intminZeroArray(vector<int>& nums, vector<vector<int>>& queries){ constint maxn = 1e3; int n = nums.size(), m = queries.size(), ans = -1; bool f[maxn + 1]; for (int i = 0; i < n; ++i) { memset(f, 0, sizeof(f)); int x = nums[i]; if (x == 0) { ans = max(ans, 0); continue; } f[0] = 1; int res = -1; for (int j = 0; j < m; ++j) { int l = queries[j][0], r = queries[j][1], v = queries[j][2]; if (l <= i && i <= r) { for (int k = maxn - v; k >= 0; --k) { if (f[k]) f[k + v] = 1; } } if (f[x]) { res = max(res, j + 1); break; } } if (res == -1) return-1; else ans = max(ans, res); } return ans; } };
classSolution { public: intminZeroArray(vector<int>& nums, vector<vector<int>>& queries){ constint maxn = 1e3; int n = nums.size(), m = queries.size(), ans = -1; for (int i = 0; i < n; ++i) { int x = nums[i]; if (x == 0) { ans = max(ans, 0); continue; } bitset<maxn + 1> f; f[0] = 1; int res = -1; for (int j = 0; j < m; ++j) { int l = queries[j][0], r = queries[j][1], v = queries[j][2]; if (l <= i && i <= r) { f |= f << v; } if (f[x]) { res = max(res, j + 1); break; } } if (res == -1) return-1; ans = max(ans, res); } return ans; } };