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;
}
posted @ 2020-10-19 21:25  jasony_sam  阅读(79)  评论(0编辑  收藏  举报