知识点:二分
这个1400的题还卡了我一会儿,思路就是二分,最优解+单调性可以判断一个题是不是用二分做,然后就是判定函数,这里的两个参数要用long long,因为累加,中间会出现溢出,就是因为这个稍微卡了一会儿
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, a[N];
bool check(int x) {
long long cnt1 = 0, cnt2 = 0;
for (int i = 1; i <= n; i++) {
if (a[i] < x) cnt2 += (long long) (x - a[i]) / 2;
else cnt1 += (long long) a[i] - x;
}
return cnt1 <= cnt2;
}
int main() {
int T;
cin >> T;
while (T--) {
memset(a, 0, sizeof(a));
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int x;
scanf("%d", &x);
a[x]++;
}
int l = 0, r = m;
while (l < r) {
int mid = (l + r) >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
cout << l << '\n';
}
return 0;
}