Codeforces Round #257 (Div. 1) A - Jzzhu and Chocolate 2017/1/11

题目链接:见这里
题意:Jzzhu有一块由n*m个单位正方形组成的巧克力,他想把这块巧克力切k次,每次切割按照以下规则。
.每次只能横着或者竖着切
.每次切割应该沿着单位正方形的边缘(不能分割单位巧克力)
.每次切割只能在巧克力内部进行,且所有切法都不同
问当切完k次后,最小的巧克力面积最大是多少。
如果不存在切割方案,输出-1。
数据
n, m, k. (1 <= n, m <= 1e9; 1 <= k <= 2e9)
输入
3 4 1
6 4 2
2 3 4
输出
6
8
-1
解题思路:假设横着切了x-1次,也就是切成x份,竖着切了y-1次,也就是切成y份,
那么ans=(n/x)*(m/y),要求1<=x<=n,1<=y<=m,x+y=k+2,显然(n+m)<(k+2)时无解,考虑枚举n/x的取值,可以证明只有O(n^0.5)种,对于固定的取值,选出最大的x,此时m/y最大,同理枚举m/y的取值来更新答案。
同时我们还可以观察一下,把y = k + 2 - x 带入到 ans里面会发现,分母是一个二次函数,方程为

y2+2y+ky

即是开口向下的二次函数,要让原等式最大,就要让分母最小,所以我们让x 和 y分别尽量小即可,复杂度从枚举的 O(sqrt(n) + sqrt(m))降为 O(1)

代码如下:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long n, m, k, x, y, ans = 0;
    cin >> n >> m >> k;
    if(n + m - 2 < k){
        puts("-1");
    }
    else{
        x = min(n - 1, k);
        ans = max(ans, (n / (x + 1)) * (m / (k + 1 - x)));
        y = min(m - 1, k);
        ans = max(ans, (m / (y + 1)) * ( n / (k + 1 - y)));
        cout << ans << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值