Jzzhu有一块由n*m个单位正方形组成的巧克力,他想把这块巧克力切k次,每次切割按照以下规则。
.每次只能横着或者竖着切
.每次切割应该沿着单位正方形的边缘(不能分割单位巧克力)
.每次切割只能在巧克力内部进行,且所有切法都不同
问当切完k次后,最小的巧克力面积最大是多少。
如果不存在切割方案,输出-1。
题解:
假设横着切x-1刀,竖着切y-1刀。
那么横着被分成x份,竖着被分成y份,最小值是n/x+m/y。
所以n/i枚举一遍,再把m/i枚举一遍即可。
每次枚举只需要枚举到sqrt(n)就可以了。参照判断素数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
ll n,m,k;
cin>>n>>m>>k;
if(n+m-2<k){
printf("-1\n");
return 0;
}
ll ans=0,que,eid,j;
for(ll i=1;i*i<=n;i++){
if(k<i-1)continue;
que=n/i;
eid=m/(k-i+2);
ans=max(que*eid,ans);
j=n/i;
if(k<j-1)continue;
que=n/j;
eid=m/(k-j+2);
ans=max(que*eid,ans);
}
swap(n,m);
for(ll i=1;i*i<=n;i++){
if(k<i-1)continue;
que=n/i;
eid=m/(k-i+2);
ans=max(que*eid,ans);
j=n/i;
if(k<j-1)continue;
que=n/j;
eid=m/(k-j+2);
ans=max(que*eid,ans);
}
cout<<ans<<endl;
return 0;
}