链接:https://www.nowcoder.com/acm/contest/133/A
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld题目描述
现在有一棵被Samsara-Karma染了k种颜色的树,每种颜色有着不同的价值
Applese觉得Samsara-Karma染的太难看了,于是打算把整棵树重新染成同一种颜色
但是,由于一些奥妙重重的原因,每一次染色Applese可以选择两个有边相连的点,将其中一个染成另一个的颜色。而进行一次这样的操作需要付出两种颜色价值和的代价
现在,Applese的钱要用来买书(game),所以他想要最小化代价
输入描述:
输入包括若干行 第一行包括一个数n,表示这棵树有n个节点 第二行包括n个数,第i个数表示第i个节点的颜色coli **注意:一个颜色的标号即价值接下来的n - 1行,每行包括两个数u, v,表示u节点与v节点之间有一条无向边
n ≤ 100000, 1 ≤ coli ≤ 1e9,数据保证是一棵树
输出描述:
输出包括一行 第一行包括一个数,表示最小代价示例1
输入
复制
4 2 3 4 3 1 2 2 3 3 4输出
复制
12#include<cstdio> #include<algorithm> #include<map> using namespace std; const int maxn = 1e5 + 100; int c[maxn]; map<long long ,long long >mp; int main() { //freopen("C://input.txt","r",stdin); int n; long long int t=0x3f3f3f3f3f3f3f3f; long long int sum=0; scanf("%d",&n); for(int i=1;i<=n;i++) { int m; scanf("%d",&m); sum+=m; mp[m]++; } for(map<long long ,long long >::iterator it=mp.begin();it!=mp.end();it++) { t=min(t,sum-(it->first * it->second)+ (it->first*(n-it->second))); } printf("%lld\n",t); return 0; }
公式 某个点的总花费=总和 - 自身值*自身点出现的次数 + 自身值*其他点的个数 (自己推一下)
这里用map用来记录一个点出现的次数。
举个例子 mp[m]++; 迭代器 it ->first=m (即m自身的值) it->second 代表mp[m](即m出现的次数)
map迭代器 it是一个指针,用 ‘->’来指向
注意 vector 的迭代器 it 可以直接用 *it 来代表其内容
一开始想用结构体 离散化来做,才发现数据范围1e9,数组开不到,只能用map。
牛客网 Wannafly挑战赛20 A-染色
最新推荐文章于 2020-04-23 10:13:10 发布