佬们,我想问问这样做有什么问题吗?
查看原帖
佬们,我想问问这样做有什么问题吗?
795355
vegetableYe楼主2023/1/5 13:43

我想的是把它们排好序,存到pair里面,按把小变大和把大变小的花费看,走更少的那个。只能过一部分5555(我是小白)有佬能举个反例吗

void solve() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) a[i] = read();
    sort(a + 1, a + 1 + n);
    for(int i = 1; i <= n; i++) {
        int cnt = 1, t = a[i], j = i;
        while(j <= n && t == a[j]) j++;
        v.push_back({t, j - i});
        i = j - 1;
    }
    int r = v.size() - 1, l = 1;
    while(m > 0 && l < r) {
        int s1 = v[r].fst - v[l + 1].fst, s2 = v[r - 1].fst - v[l].fst;
        if(m >= v[l].scd && m >= v[r].scd) {
            if(s1 > s2) {
                m -= v[r].scd;
                v[l].scd += v[r -- ].scd;
            }
            else if(s1 < s2) {
                m -= v[l].scd;
                v[r].scd += v[l ++ ].scd;
            }
            else {
                int x = v[l].scd, y = v[r].scd;
                if(x > y) {
                    m -= y;
                    v[l].scd += v[r -- ].scd;
                }
                else {
                    m -= x;
                    v[r].scd += v[l ++ ].scd;
                }
            }
        }
        else if(m >= v[l].scd) {
            m -= v[l].scd;
            v[r].scd += v[l ++ ].scd;
        }
        else if(m >= v[r].scd) {
            m -= v[r].scd;
            v[l].scd += v[r -- ].scd;
        }
        else break;
    }
    cout << v[r].fst - v[l].fst << endl;
}
2023/1/5 13:43
加载中...