题目描述
爱吃甜食的兔兔在冰箱里放了许多大块巧克力,然而算法小朋友们惦记了好久。本着平均分配的原则,兔兔打算将n大块巧克力平均分给k个小朋友。
由于兔兔不会计算长方体的体积,采用了最简单粗暴的切割方式,兔兔跟小朋友们约定将巧克力切割成边长相等且为整数的正立方体小块,这样大家得到的巧克力就相同了(多余的部分兔兔就可以留给自己吃了●_●)。
但是聪明的小朋友们立刻根据每块巧克力的长宽高,计算出可以切割成的最大正方体体积,你就是小朋友中的一员,请你计算出你可以分得的巧克力体积(切割时不考虑巧克力受热损耗,不允许拼接巧克力)。
输入格式
第一行两个正整数
n
n
n 和
k
k
k
接下来n行,每行三个正整数
a
,
b
,
c
a,b,c
a,b,c 表示每块巧克力的长宽高。
输出格式
一个正整数表示小朋友分得的最大正方体体积。
样例 #1
样例输入 #1
2 5
3 5 6
6 6 8
样例输出 #1
27
提示
50
50
50% 的数据
1
≤
n
,
k
≤
10
1≤n,k≤10
1≤n,k≤10 ,
1
≤
a
,
b
,
c
≤
50
1≤a,b,c≤50
1≤a,b,c≤50
100
100
100% 的数据
1
≤
n
,
k
,
a
,
b
,
c
≤
1
0
5
1≤n,k,a,b,c≤ 10^{5}
1≤n,k,a,b,c≤105
思考1:兔兔刀比较钝,每次切割有单位1的损耗如何做
思考2:兔兔接受建议,边长可以切割小数如何做
思考3:兔兔学会了计算长方体体积,允许将巧克力分成长方体如何做(仍然不允许拼接巧克力)
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],b[N],c[N],n,k;
bool chk(int x)
{
int i;
long long cnt=0;
for(int i=1;i<=n;i++)
{
cnt+=1LL*(a[i]/x)*(b[i]/x)*(c[i]/x);
if(cnt>=k)
{
return true;
}
}
return false;
}
int main()
{
int i,l,r,mid;
long long ans=0;
cin>>n>>k;
for(i=1;i<=n;i++)
{
cin>>a[i]>>b[i]>>c[i];
}
l=1;
r=100000;
while(l<=r)
{
mid=(l+r)/2;
if(chk(mid))
{
ans=1LL*mid*mid*mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
cout<<ans;
return 0;
}