BSOJ:3800 染色--贪心

29 篇文章 0 订阅
8 篇文章 0 订阅

3800 – 【四校联考1】染色
Description
  人人生而平等,然而后来人们逐渐选择了不同的道路,人与人之间,变得不再平等。你可能会因为染上恶人之色而堕落,成为社会的败类;你也可能因为染上善人之色,而在逆境中不断成长。但是,红与黑并非绝对的。所谓“近朱者赤,近墨者黑”,你能改变周遭的环境,那么周遭的环境也会影响你。在黑暗的人群中,善人之色是明亮的,而在明亮的人群中,善人之色的存在就会显得微薄。你的颜色,依靠着你自己的意志在选择。
  如今,你获得了一次重生,你要为自己,以及你周围的人们,重新染上一种你真正想要的颜色。具体来说,你的圈子里总共有N个人,每个人你可以选择为其重新染色,或者不染。对于第i个人,如果他/她被重新染色,那么这将会对社会带来wi的改变。同时,朋友关系也会对社会带来改变,如果i,j是朋友,那么他/她们会对社会带来的改变w(i,j)满足
  这里写图片描述

Input
这里写图片描述

Output
输出仅一行为一个整数,对社会产生的总的改变的最大值。

Sample Input
3
1 2 3
2
1 2 1
2 3 2

Sample Output
9

Hint
【数据规模与约定】
对于40%的数据,M=0。
对于另外40% 的数据,N,M≤20。
对于所有数据,N,M≤10^5。

一开始还以为是一道很难的图论..结果证明我傻了,可以证明2个点之间的状态只能是均被染色或均未被染色,把边权分两种情况放在点权上,累加两种情况最大值即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define ll long long
//#include<cmath>
using namespace std;
inline ll read()
{
    ll bj=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')bj=-1;
        ch=getchar();
    }
    ll ret=0;
    while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();
    return ret*bj;
}
ll n,m;
double x[100005],y[100005],ans=0.0;
int main()
{
    n=read();
    for(ll i=1;i<=n;i++)scanf("%lf",&x[i]);
    m=read();
    for(ll i=1;i<=m;i++)
    {
        ll u,v;double w;
        u=read();v=read();scanf("%lf",&w);
        x[u]+=w/2.0;
        y[u]-=w/2.0;
        x[v]+=w/2.0;
        y[v]-=w/2.0;
    }
    for(ll i=1;i<=n;i++)ans+=max(x[i],y[i]);
    printf("%lld\n",(ll)(ans));
return 0;
}
/*
>sample input:
3
1 2 3
2
1 2 1
2 3 2

>ans:
9
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值