最小連通代價

临江柔發表於2024-06-15

void solve() {
    int n, a, b;
    cin >> n >> a >> b;
    
    int j = 0, o = 0;
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        if (x & 1) j++;
        else o++;
    }
    
    int ans = 1e18;
    if (j && !o) {
        ans = min(ans, a * (j - 1));
        ans = min(ans, a * j * (j - 1) / 2);
    } else if (o && !j) {
        ans = min(ans, a * (o - 1));
        ans = min(ans, a * o * (o - 1) / 2);
    }
    if (j && o) {
        ans = min(ans, a * (j + o - 2) + b);
        ans = min(ans, b * max(j, o) + a * (min(j, o) - 1));
        ans = min(ans, b * max(j, o) + b * (min(j, o) - 1));
        ans = min(ans, b * o * j);
        ans = min(ans, a * (j * (j - 1) / 2 + o * (o - 1) / 2) + b);
        ans = min(ans, b * o * j + a * (j * (j - 1) / 2 + o * (o - 1) / 2));
    }
    
    cout << ans << endl;
}

相關文章