题解 | #最小连通代价#

最小连通代价

https://ac.nowcoder.com/acm/problem/274537

题意:同奇偶连线代价为a,不同奇偶连线代价为b,求n个点连线的最小代价【注意a和b可以<=0】

思路: 很明显我们可以手绘出两层

奇数: x x x x

偶数: x x x x x

开始分类讨论【注意奇数或偶数的个数为0的情况,就必须只能同类连线】:

1.若a<0,b<0:连的线越多越好 同类两两连线,不同类也两两连线

2.若a<0,b>=0 或 a>0,b<=0:同类全都连线,不同奇偶类间连一条线

3.若a>0,b>0:分类如果a<b则同类连线,不同类连一根;若b<a,则不同类之间连线

void solve()
{
	int n, a, b;
	cin >> n >> a >> b;
	int cnt1 = 0, cnt2 = 0;
	for (int i = 1; i <= n; i++)
	{
		int num;
		cin >> num;
		if (num % 2)
			cnt1++;
		else
			cnt2++;
	}
	int na = 0, nb = 0;
	if (a <= 0 && b <= 0)
	{
		na = cnt1 * (cnt1 - 1) / 2 + (cnt2) * (cnt2 - 1) / 2;
		nb = cnt1 * cnt2;
	}
	else if (a <= 0 && b > 0)
	{
		na = cnt1 * (cnt1 - 1) / 2 + cnt2 * (cnt2 - 1) / 2;
		if (cnt1 && cnt2)
			nb = 1;
	}
	else if (a > 0 && b <= 0)
	{
		if (cnt1 && cnt2)
			nb = cnt1 * cnt2, na = 0;
		else
			na = n - 1, nb = 0;
	}
	else if (a > 0 && b > 0)
	{
		if (cnt1 && cnt2)
		{
			if (a < b)
				nb = 1, na = n - 2;
			else
				nb = n - 1, na = 0;
		}
		else
		{
			nb = 0, na = n - 1;
		}
	}
	int ans = 0;
	ans = a * na + b * nb;
	cout << ans << endl;
}
全部评论

相关推荐

点赞 评论 收藏
分享
06-25 09:33
厦门大学 Java
程序员饺子:现在日常估计没啥hc了,等到八月多估计就慢慢有了。双九✌🏻不用焦虑的
投递快手等公司8个岗位
点赞 评论 收藏
分享
06-10 21:15
门头沟学院 Java
宁阿:好多这种没🧠的公司,他们估计都不知道毕业的人不能给安排实习岗
实习吐槽大会
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-29 17:30
找实习找着找着就要进入7月了,马上秋招也要开始了,找实习还有意义吗?
绝迹的星:有面就面, 没面上就当日薪4位数大佬免费培训, 面上了再考虑要不要实习
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务