CF449A题解

CF449A题解

思路

切法分为这几种情况:

  1. 输出 \(-1\) 的情况:首先,先分析最多能且几刀,横着切最多可以切 \(n-1\) 刀,竖着切最多可以切 \(m-1\) 刀,所以 \(k \leqslant n+m-2\)。也就是说当 \(k>n+m-2\) 时,直接输出 \(-1\)
  2. \(k<m\)\(k<n\) 时,这种情况非常简单,最优的就是都是横着切或者都是竖着切,且 \(k\) 刀就把整块分成了 \(k+1\) 块,这时重点就来了,要比较全横着切和全竖着切,要是全横着切,长为 \(m\),宽为 \(\lfloor n*\frac{1}{k+1}\rfloor\),全竖着切同理,最后输出两个中最大的。
  3. \(k<m\)\(k\geqslant n\) 时,那竖着最优的就是全竖着切,与第 \(2\) 种同理。另一种就是先横着切把一整块切成 \(n\)\(1\times m\) 的条条,这时已经切了 \(n-1\) 刀,剩下 \(k-n+1\) 刀,这么多刀会将每条 \(1\times m\) 切成 \(k-n+2\) 块,所以这时的最优情况为长为 \(\lfloor m*\frac{1}{k-n+2}\rfloor\),宽为 \(1\)。最后输出两个中最大的。
  4. \(k\geqslant m\)\(k<n\) 时,方法同第 \(3\) 种情况。
  5. \(k\geqslant m\)\(k\geqslant n\) 时,方法同第 \(3\) 种情况。一种是长为 \(\lfloor m*\frac{1}{k-n+2}\rfloor\),宽为 \(1\);一种是长为 \(\lfloor n*\frac{1}{k-m+2}\rfloor\),宽为 \(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 @ 2025-01-29 15:24  naroto2022  阅读(24)  评论(0)    收藏  举报