链接: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
思路:这个赛季最后一场巅峰赛打自闭了,但不得不说这道题出的很好啊,本以为是一道很难的题目,但是听完赛后题解后发现真的是水题一道!
对于这道题一开始我是没有思路的,以为是大顶堆瞎搞搞,但是搞来搞去找不到正确的贪心思想,而其实仔细想想我们发现这道题还是有东西可寻的,对于题目中的共鸣关系,我们发现当两个音符同时敲响是共鸣效果是z,只响其中一个的时候是0,两个都不响的时候是-z,仔细思考下会发现,其实每次响一个都会有z的共鸣效果,因此我们可以把绑定的问题转化为单体问题,对于每个音符我们只需要考虑敲响他会增加多少共鸣效果即可,而这也是解决该题的关键所在。
class Solution {
public:
long long max(long long a,long long b){
return a>b?a:b;
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n int整型
* @param m int整型
* @param a int整型vector
* @param b int整型vector<vector<>>
* @return long长整型
*/
long long ans;
long long s[100005];
long long wwork(int n, int m, vector<int>& a, vector<vector<int> >& b) {
// write code here
ans=0;
for(int i=0;i<n;i++)
s[i]=a[i];
for(int i=0;i<m;i++){
s[b[i][0]-1]+=b[i][2];
s[b[i][1]-1]+=b[i][2];
ans-=b[i][2];
}
for(int i=0;i<n;i++)
ans+=max(s[i],0L);
return ans;
}
};