我想的是把它们排好序,存到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;
}