0%

51nod-1889-制铁棒

题目:
 工厂里面,有n根待加工的铁棒,长度以米为单位,精确到小数点后两位(即厘米),现在市场上需求量是m根相同长度的铁棒。现在厂长想把这n根铁棒进行切割,切割的时候要精确到厘米,比如说,原来铁棒是1.00米的,那么可以切成0.50和0.50的,但是不能切成0.499和0.501的。并且不能将两根铁棒拼成一根铁棒。现在厂长想知道切出来的m根铁棒最长能有多长。

输入
 单组测试数据。
 第一行给出两个整数n(1 <= n<= 10000)和m(1 <= m< = 10000)。
接下来n行给出原始铁棒的长度L[1],L[2],L[3],…,L[n] ,(1<=L[i]<=100,000)。以米为单位,精确到小数点后两位。
输出
 输出一个小数表示答案,精确到小数点后两位。
输入样例
样例输入1
4 11
8.02
7.43
4.57
5.39
输出样例
样例输出1
2.00
解法:
 二分分情况讨论即可,因为题目有小数点限制,这里我直接*100 最后/100处理了这个情况
ps:(每天没时间刷题555555,选个一眼题找找手感,二分的边界情况还是有点乱,改天整理一下)
代码

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
31
32
33
34
35
using namespace std;
int n,m;
int a[100010];
bool c(int x)
{
if(x == 0)
return true;
long long sum = 0;
for(int i = 0; i < n; i++)
sum += a[i]/x;
return sum >= m;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 0; i < n; i++){
double s;
scanf("%lf", &s);
a[i] = s*100;
}
int l = 1, r = 10000000;
for(int i = 0; i < 200; i++)
{
int m = (l+r)/2;
if(c(m))
l = m;
else
r = m - 1;
}
if(c(r))
printf("%.2f\n",r*1.0/100);
else
printf("%.2f\n",l*1.0/100);
return 0;
}