1731: 数棍子
时间限制: 1 Sec 内存限制: 128 MB
[提交][状态][讨论版]
题目描述
假如你手头上有一些长度参差不齐的木棍,他想将每根都裁剪成若干段自己想要的长度,并丢掉多余的部分。因为你的手很巧,所以你的裁剪过程不会有任何的失误。也就是说,对于一根长度为N的木棍,你可以精准的将它们裁剪为若干段木棍,使它们的长度之和为N。
你不知道裁剪成多长比较好,所以干脆越长越好。不过由于你有点强迫症,所以你希望长度为非负整数。保证所有木棍的原长也是非负整数。那么请问你最终得到的每根木棍多长呢?
输入
第一行两个正整数N、K,表示木棍原本的根数和华华希望得到的木棍根数。
第二行N个正整数
L
i
表示每根木棍的初始长度。
多组数据输入
1≤N≤2×1e5,1≤Li≤1e9,1≤K≤1e9
输出
输出一行一个非负整数表示每根木棍的最大长度
样例输入
5 10
4 4 4 5 3
5 3
1 2 3 4 5
样例输出
1
3
提示
第一组数据:如果长度为2,只能得到2+2+2+2+1=9根,不够;长度为1可以得到4+4+4+5+3=20根,足够。所以答案最大是1
来源
Ac_code:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn = 2e5+5;
LL a[maxn];
int main()
{
LL n,k;
while(~scanf("%lld%lld",&n,&k))
{
LL l = 1,r = 0;
LL ans = 0;
LL sum = 0;
for(LL i = 0; i < n; i++)
{
scanf("%lld",&a[i]);
sum += a[i];
r = max(a[i],r);
}
if(sum <= k)
{
if(sum == k) ans = 1;
printf("%lld\n",ans);
continue;
}
while(l <= r)
{
LL mid = (l+r)>>1;
LL cnt = 0;
for(LL i = 0; i < n; i++)
{
cnt += a[i]/mid;
}
if(cnt >= k)
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
ans = r;
printf("%lld\n",ans);
}
return 0;
}