CF449A题解
CF449A题解
思路
切法分为这几种情况:
- 输出 −1 的情况:首先,先分析最多能且几刀,横着切最多可以切 n−1 刀,竖着切最多可以切 m−1 刀,所以 k⩽n+m−2。也就是说当 k>n+m−2 时,直接输出 −1。
- 当 k<m 且 k<n 时,这种情况非常简单,最优的就是都是横着切或者都是竖着切,且 k 刀就把整块分成了 k+1 块,这时重点就来了,要比较全横着切和全竖着切,要是全横着切,长为 m,宽为 ⌊n∗1k+1⌋,全竖着切同理,最后输出两个中最大的。
- 当 k<m 且 k⩾n 时,那竖着最优的就是全竖着切,与第 2 种同理。另一种就是先横着切把一整块切成 n 条 1×m 的条条,这时已经切了 n−1 刀,剩下 k−n+1 刀,这么多刀会将每条 1×m 切成 k−n+2 块,所以这时的最优情况为长为 ⌊m∗1k−n+2⌋,宽为 1。最后输出两个中最大的。
- 当 k⩾m 且 k<n 时,方法同第 3 种情况。
- 当 k⩾m 且 k⩾n 时,方法同第 3 种情况。一种是长为 ⌊m∗1k−n+2⌋,宽为 1;一种是长为 ⌊n∗1k−m+2⌋,宽为 1。输出两者中大的即可。
那么难点来了!怎么求面积呢?非常简单!长乘宽就行了。
总结
- 本题因为输出必须为整数,所以要向下取整,因此每种情况都需要比较横竖那个更大。
- 要分类讨论。
- 面积公式是长乘宽。
废话不多说,上代码!
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m,k;
int main(){
scanf("%lld %lld %lld",&n,&m,&k);//输入
if(k>n+m-2) cout<<"-1";//情况1
else if(k<m&&k<n) cout<<max(n*(m/(k+1)),m*(n/(k+1)));//情况2
else if(k<m&&k>=n) cout<<max(n*(m/(k+1)),m/(k-n+2));//情况3
else if(k>=m&&k<n) cout<<max(n/(k-m+2),m*(n/(k+1)));//情况4
else cout<<max(n/(k-m+2),m/(k-n+2));//情况5
return 0;//完结撒花
}
//一定要有max比较每种情况中较大的,必然听取WA声一片
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现