文章目录
- 1. 题目
- 2. 解题
1. 题目
链接:https://ac.nowcoder.com/acm/contest/10325/B
来源:牛客网
现在有n个音符和m对共鸣关系,编号为1~n,
每个音符自己有一个奏响时的优美程度,
共鸣关系(x,y,z)表示音符x和y同时奏响的额外优美程度是 z,同时不奏响则为 -z,其他情况为0。
音符可以选择奏响或者不奏响,不奏响的音符没有优美程度。
我们想知道最大的优美程度和是多少,我们不需要知道具体是哪些音符被奏响了,只需输出最大和即可。
共鸣关系可能有重复,其共鸣效果也会重复叠加。
示例1
输入
2,1,[-10,-10],[[1,2,5]]
返回值
-5备注:
数据包括两个数n,m,一个长度为n的数组a[],
表示每个音符奏响时的优美程度(a[0]表示第一个音符),
一个第一维长度为m的二维数组,描述m组共鸣关系。
输出一个整数表示答案。
n,m<=100000,所有的优美程度和额外优美程度的绝对值<=33000
2. 解题
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* * @param n int整型 * @param m int整型 * @param a int整型vector * @param b int整型vector<vector<>> * @return long长整型*/long long wwork(int n, int m, vector<int>& a, vector<vector<int> >& b) {// write code here// 初始为都没有奏响,收益是 -zlong long ans = 0;vector<long long> delta(n, 0);for(int i = 0; i < m; ++i) {ans -= b[i][2]; // 都没有响 -zdelta[b[i][0]-1] += b[i][2];//响一个的话 +z,跟上面的-z抵消为0delta[b[i][1]-1] += b[i][2];//同时响的话,为z}for(int i = 0; i < n; i++){if(a[i]+delta[i] > 0)//收益为正ans += a[i]+delta[i];}return ans;}
};
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!