CF449A Jzzhu and Chocolate
Solution
可以设横向切了 \(x\) 次,则纵着切了 \(k-x\) 刀,为使最小值最大化,所以要切的均匀。那么 \(ans=\left\lfloor\dfrac n{x+1}\right\rfloor\cdot\left\lfloor\dfrac m{k-x+1}\right\rfloor(0\leq x\leq k)\) 。
因为 \(\left\lfloor\dfrac n{i}\right\rfloor\) 最多有 \(\sqrt n\) 种取值,所以枚举找最小值即可。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,k;
ll solve(ll n,ll m,ll k){
ll ans=1;
for(int i=1,pre=0;i<=n;i=pre+1){
pre=n/(n/i);
if(pre>k+1){
ans=max(ans,n/(k+1)*m);
break;
}
ans=max(ans,(n/pre)*(m/(k-pre+2)));
}
return ans;
}
int main(){
while(~scanf("%lld%lld%lld",&n,&m,&k)){
if(k>n+m-2) puts("-1");
else printf("%lld\n",solve(n,m,k));
}
return 0;
}