比较难的一道二分题,我们可以设x为一共扔出的次数,也就是说进行了x次扔出k个球的操作,那么扔出的球就是k*x个

接下来,假设每一种球有n中,那我们最多扔出的该颜色球就是min(x,n)个,只用检查扔出所有球的个数和kx的大小关系即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<bits/stdc++.h>
using i64=long long;
#define rep(i,a,n) for(i64 i=(a);i<=(n);i++)
#define per(i,a,n) for(i64 i=(n);i>=(a);i--)
#define mst(a,x) memset(a,x,sizeof(a))
using namespace std;
const int N = 2e5 + 9;
i64 a[N], n, k, nw;
bool check(i64 x)
{
nw = 0;
rep(i, 1, n) nw += min(x, a[i]);
if(nw / k >= x) {return true;}
return false;
}
int main()
{
cin>>n>>k;
rep(i, 1, n) cin>>a[i];
i64 l = 0ll, r = 1e15, ans = 0ll;
while(l <= r)
{
i64 mid = (l + r) >> 1;
if(check(mid)) ans = mid, l = mid + 1;
else r = mid - 1;
}
cout << ans << '\n';
return 0;
}

后续可能继续更新