• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 巧克力切割问题

巧克力切割问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了查理和巧克力工厂问题,关于巧克力的问题,德芙巧克力问题,德芙巧克力有问题吗,巧克力问题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:巧克力切割问题
描述:

【问题描述】
Jzzhu 有一块很大的巧克力,它由 n?×?m个正方形小块组成。Jzzhu 想要对巧克力进行 k 次切割。每次切割都满足如下规则:

  1. 每次切割都必须是直的 (横向或纵向);
  2. 每次切割都必须沿着正方形小块的边缘(不能切到里面);
  3. 每次都必须一切到底。

想象 Jzzhu 进行了 k 次切割,巧克力被分成了几块。现在请考虑最小的那一块,Jzzhu 希望这一块尽可能的大。那么在切割k次后这块最小的巧克力的大小的最大值是多少?巧克力的大小请以其所含的正方形小块的个数为基准。

【输入】

仅有一行,包含 n,?m,?k

【输出】

输出共一行,包含一个整数,表示最小块的最大值。如果无法切割 k 次,输出 -1。
比如说 6*7 的巧克力分 5 刀,答案为 7。

【输入输出样例 1】

in
6 4 2  
out
8

【输入输出样例 2】

in
2 3 4  
out
-1

解决方案1:

使最小的最大,只有一种方法 —— 取平均值 。(思考一下为什么)

所以枚举纵向砍几刀,横向砍几刀。取最大值就可以了。

这题是Codeforces原题。

出题人如果不标出处的话,祝他内存泄露 :)

解决方案2:

首先这个是Codeforces原题链接。div2 c
看了采纳的那个回答。感觉有点问题,因为涉及到的操作都是整除所以有时贪心是不对的。
说另一个非贪心做法。
原题中n,m<=10^9显然O(n)的算法是过不去的。
(当时做那场cf的时候是bk大神告诉的做法。)
首先判无解。
有解时,然后我们要枚举切几刀,显然平均更优,但是这个枚举不能每个都枚举。
我们要求的是 [n/x]*[m/(k-x)]的最大值([]下取整)。
可以证明一个数n,整除它的结果最多只有2√n种取值。
然后就可以枚举[n/x]的取值。
就可以在O(√n)时间内解决。

解决方案3:

一、k < min(m,n)
计算 (m//(k+1))*n 和 (n//(k+1))*m,取较大者

二、 min(m,n) <= k < max(m,n), 这里假设 m>n
计算 (m//(k+1))*n 和 m//(k-n+2),取较大者

三、 k >= max(m, n)
计算m//(k-n+2) 和 n//(k-m+2), 较大者

四、 k > m+n-2
out: -1

注: // 为整除

思路大概就是:
切k刀,即分k+1块,所以好的情况是均分(整除),所以有任何一边能被k+1整除,答案就出来的;
但是如果min(m,n) <= k < max(m,n) 即小的一边够切,长边够切:那就分别考虑短边切完再切长边,和只切长边的情况;
如果k >= max(m, n),即长短边都不够切:那就分别考虑先长后短 和 先短后长的情况。
最后k > m+n-2,这种就是下不了刀了,都切满了。
PS:上面有个假设一定要先切完一边再切另一边,我是这样认为的,每多一刀,每块大小从1/k 减少到 1/(k+1),即1/(k+1)*k, 即减少量递减,如果换到另外一边则k=1,则直接减少一半! 上面假设没有严谨证明,可能是错误的,哈哈~

PS: WA回来说一声,我再仔细想想


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 巧克力切割问题

相关文章

  • 2017-06-07 memcache、redis等缓存框架怎么保证缓存数据的正确性
  • 2017-06-07 关于WORD引用EXCEL数据的VBA代码问题
  • 2017-06-07 类型为自定义的域名设置为默认失败~
  • 2017-06-07 求教一个算法,有伪码就更好了
  • 2017-06-07 laravel52如何在中间件中向视图传递变量?
  • 2017-06-07 (python)怎么在一个模型中添加无数个相同字段?
  • 2017-06-07 正则表达式查找前后不是数字的小数点?
  • 2017-06-07 MacOSX上如何获取系统当前的详细信息
  • 2017-06-07 memcpy函数形参指针类型能不能是char?
  • 2017-06-07 scrapy爬取googleplay用vpn还是vps?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 无法删除文件无法读源文件或磁盘pythonflask模块无法调用
    • laravelapi接口外站post请求
    • (python)scrapy抓不到起始网页内容
    • 写livepaper
    • (python)pymysql操作数据库成功,但为何检查了数据库那边,数据没有更新的?
    • 刚开始接触VBA开发,为什么我的没有串口通信控件
    • 如何编程实现“2+2=5”?
    • nodejs使用七牛覆盖上传文件文件更新时间正确但文件却没有更新是怎么回事?
    • centos安装教程centos安装redis出错
    • scrapy:TypeError:expectedstringorbuffer

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有