CF449A题解

CF449A题解

思路

切法分为这几种情况:

  1. 输出 1 的情况:首先,先分析最多能且几刀,横着切最多可以切 n1 刀,竖着切最多可以切 m1 刀,所以 kn+m2。也就是说当 k>n+m2 时,直接输出 1
  2. k<mk<n 时,这种情况非常简单,最优的就是都是横着切或者都是竖着切,且 k 刀就把整块分成了 k+1 块,这时重点就来了,要比较全横着切和全竖着切,要是全横着切,长为 m,宽为 n1k+1,全竖着切同理,最后输出两个中最大的。
  3. k<mkn 时,那竖着最优的就是全竖着切,与第 2 种同理。另一种就是先横着切把一整块切成 n1×m 的条条,这时已经切了 n1 刀,剩下 kn+1 刀,这么多刀会将每条 1×m 切成 kn+2 块,所以这时的最优情况为长为 m1kn+2,宽为 1。最后输出两个中最大的。
  4. kmk<n 时,方法同第 3 种情况。
  5. kmkn 时,方法同第 3 种情况。一种是长为 m1kn+2,宽为 1;一种是长为 n1km+2,宽为 1。输出两者中大的即可。

那么难点来了!怎么求面积呢?非常简单!长乘宽就行了。

总结

  1. 本题因为输出必须为整数,所以要向下取整,因此每种情况都需要比较横竖那个更大。
  2. 要分类讨论。
  3. 面积公式是长乘宽。

废话不多说,上代码!

#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声一片 
posted @   naroto2022  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
花开如火,也如寂寞。