牛客巅峰赛S2第12场 - 钻石&王者 | B.共鸣问题(思维)

题意:
现在有n个音符和m对共鸣关系,编号为1~n,每个音符自己有一个奏响时的优美程度,
共鸣关系(x,y,z)表示音符x和y同时奏响的额外优美程度是z,同时不奏响则为-z,其他情况为0。
音符可以选择奏响或者不奏响,不奏响的音符没有优美程度。
我们想知道最大的优美程度和是多少,我们不需要知道具体是哪些音符被奏响了,只需输出最大和即可。

数据范围:n,m<=1e5|a[i]|,|z|<=33000
解法:
对于(x,y,z)
如果x和y都选,那么ans+=z,
如果x和y选择其中一个,那么ans+=0,
如果x和y都不选,那么ans+=-z.

实际上可以变为,一开始x和y都不选,当前ans=-z,
然后如果选择x和y中的一个,那么ans+=z,此时ans=0,
如果在选择一个,那么ans+=z,此时ans=z.

因此问题变为了每选择关系中的一个点,那么对答案造成z的贡献,
因此计算出每个点选中会造成多少贡献v,如果v>0,那么则选中,

然后这题就做完了.
code:
#define ll long long
const int maxm=1e5+5;
ll v[maxm];
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) {
        for(int i=0;i<n;i++){
            v[i+1]=a[i];
        }
        ll ans=0;
        for(auto i:b){
            int x=i[0],y=i[1],z=i[2];
            v[x]+=z;
            v[y]+=z;
            ans-=z;
        }
        for(int i=1;i<=n;i++){
            if(v[i]>0){
                ans+=v[i];
            }
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值