牛客 Wannafly挑战赛20--染色

https://www.nowcoder.com/acm/contest/133/A

题意:一颗n个节点的树,想要将他涂成相同的颜色,将任意有边连接的两个点可以换成其中一种颜色,花费是两种颜色的和,求所有点同色的最小花费

思路:因为是树,边无向,从任意一点,一定可以遍历整棵树。那么其实边的连接是没有影响的,直接对每种颜色考虑若最终状态是这个颜色的话,最小花费是多少,然后对每个颜色的花费取最小。

而对每个颜色,找到颜色的对应点,若想将整棵树都变成当前颜色,即可想想从当前点传染旁边的有边连接的点,颜色不同时,花费两点之和,颜色同时,不用变,所以对于每种颜色花费就是所有点的和-当前颜色*当前颜色数量(==其他颜色的和)+其他颜色点的个数*当前颜色(感染其他点成当前颜色,一定要花费当前颜色一次)

感想:比较简单的一个题,就是要注意long long 。今晚上打的牛客也就做了这么一个题,,,其他的真的做不了。。。完全没有想法。。QAQ

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,a[100005],look[100005],p,x,y;
long long sum,ans;
int main()
{
    map<long long ,long long>ma;
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        if(ma[a[i]]==0) {look[++p]=a[i];}
        ma[a[i]]++;
        sum+=a[i];
    }
    for(int i=1;i<n;i++)
    {
        scanf("%lld%lld",&x,&y);
    }
    ans=100000000000000000;
    for(int i=1;i<=p;i++)
    {
        ans=min(ans,sum-look[i]*ma[look[i]]+look[i]*(n-ma[look[i]]));
    }
    printf("%lld\n",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_37868325/article/details/81139606