Jzzhu and Chocolate

时间:2023-03-09 16:21:40
Jzzhu and Chocolate

CF#257 div2 C:http://codeforces.com/contest/450/problem/C

题意:n*m的方格,每次可以横着或者纵向的切一刀,问切k之后,最小的最大是多少。

题解:比赛的时候没有想到怎么处理,看了别人的题解,才恍然大悟。有一定的数学知识。最终块的大小平均来算是n(k1+1)*m/(k2+1),k1,k2分别表示横向切和纵向切的刀数,由于k1+k2==k,所以,要使得上述值最大,必须是(k1+1)*(k2+1)最小,就是让k1和k2 的差值越大即可。所以,我们总是把其中一维切完再切第二维。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long n,m,k,ans;
int main(){
while(~scanf("%I64d%I64d%I64d",&n,&m,&k)){
if(n+m-<k)ans=-;
else if(n+m-==k)ans=;
else {
if(n->=k)ans=m*(n/(k+));
else if(n-<k)ans=m/(k-n+);
if(m-<k)ans=max(ans,n/(k-m+));
else ans=max(ans,n*(m/(k+)));
}
printf("%I64d\n",ans);
}
}