目录
100231. 超过阈值的最少操作数 I
原题链接
思路分析
AC代码
100232. 超过阈值的最少操作数 II
原题链接
思路分析
AC代码
100226. 在带权树网络中统计可连接服务器对数目
原题链接
思路分析
AC代码
100210. 最大节点价值之和
原题链接
思路分析
AC代码
100231. 超过阈值的最少操作数 I
原题链接
超过阈值的最少操作数 I - 力扣 (LeetCode) 竞赛
思路分析
签到题,没啥说的
AC代码
class Solution {
public:int minOperations(vector<int>& nums, int k) {sort(nums.begin(), nums.end());return lower_bound(nums.begin(), nums.end(), k) - nums.begin();}
};
100232. 超过阈值的最少操作数 II
原题链接
100232. 超过阈值的最少操作数 II
思路分析
数组放到小根堆,检测是否全部大于等于k
如果有小于k的,就弹出俩元素,添加新元素
AC代码
class Solution
{
public:int minOperations(vector<int> &nums, int k){long long res = 0, a, b;priority_queue<long long, vector<long long>, greater<long long>> pq;for (auto x : nums)pq.emplace(x);while (pq.top() < k)a = pq.top(), pq.pop(), b = pq.top(), pq.pop(), pq.emplace(a * 2 + b), res++;return res;}
};
100226. 在带权树网络中统计可连接服务器对数目
原题链接
100226. 在带权树网络中统计可连接服务器对数目
思路分析
枚举中间服务器c,顺序从邻接点往下遍历,假如对某个邻接点遍历,得到可被整除路径数目为tot,之前遍历到的可被整除路径数目为s,那么根据乘法原理,答案要增加tot*s
计算中间服务器c的贡献需要O(N),n个点计算一遍是O(N^2)
AC代码
const int N = 1005, M = N * N;
class Solution
{
public:struct edge{int v, w, nxt;} edges[M];int head[N], idx = 0;void addedge(int u, int v, int w){edges[idx] = {v, w, head[u]}, head[u] = idx++;}vector<int> countPairsOfConnectableServers(vector<vector<int>> &g, int signalSpeed){int n = g.size() + 1, tot = 0;memset(head, -1, sizeof head), idx = 0;vector<int> ret(n);for (auto &e : g)addedge(e[0], e[1], e[2]), addedge(e[1], e[0], e[2]);function<void(int, int, int)> dfs = [&](int u, int fa, long long pre){if ((pre % signalSpeed) == 0)tot++;for (int i = head[u]; ~i; i = edges[i].nxt){int v = edges[i].v;if (v == fa)continue;dfs(v, u, pre + edges[i].w);}};for (int u = 0, s = 0; u < n; u++){s=0;for (int i = head[u], v; ~i; i = edges[i].nxt){tot = 0, v = edges[i].v, dfs(v, u, edges[i].w);ret[u] += s * tot, s += tot;}}return ret;}
};
100210. 最大节点价值之和
原题链接
最大节点价值之和 - 力扣 (LeetCode) 竞赛
思路分析
我们考虑,最终得到的最大数组和原数组相比看,可不可能只有奇数个元素发生变化
答案是不可能,自己可以模拟一下
因此必然有偶数个数发生变化
而对于numi和numj如果发生变化,我们一定可以做到只改变numi和numj而不影响其它元素
只要把路径上的边都操作一遍即可
所以问题就变成了偶数个数目进行异或k后数组的最大和
这个线性dp即可,跟树没关系
AC代码
class Solution {
public:long long maximumValueSum(vector<int>& nums, int k, vector<vector<int>>& edges) {long long f0 = 0, f1 = -1e9, t;for(int x : nums) t = f0, f0 = max(f0 + x, f1 + (x ^ k)), f1 = max(t + (x ^ k), f1 + x);return f0;}
};