题意:同奇偶连线代价为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;
}