一、内容
题意:给定一组序列,给定一个K,在k以内的操作,每次操作可以让一个数+1,求最大的中位数。
二、思路
- O(n)扫描数组,遇到比它大的就判断一下是否能够加到相同,不能加到相同就加最多能加的数。
- 用一个same变量记录有多少个与它相同的数。
三、代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 2e5 +5;
//same是相同的数的个数
long long n, k, num[maxn], mIndex, same = 1;
int main() {
scanf("%lld%lld", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%lld", num + i);
}
sort(num + 1, num + 1 + n);
mIndex = n / 2 + 1;
for (int i = n / 2 + 2; i <= n; i++) {
if (num[mIndex] == num[i]) {
same++;
continue;
} else {
//可能或过大 所以用longlong
long long tem = same * (num[i] - num[mIndex]);
if (tem <= k) {
k -= tem;
num[mIndex] = num[i];
same++;
} else {
num[mIndex] += k / same;
k = 0;
break;
}
}
if (same > k) break;
}
//避免跳过n
if (same <= k) {
num[mIndex] += k / same;
}
printf("%lld\n", num[mIndex]);
return 0;
}