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 的差值越大即可。所以,我们总是把其中一维切完再切第二维。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 long long n,m,k,ans; 7 int main(){ 8 while(~scanf("%I64d%I64d%I64d",&n,&m,&k)){ 9 if(n+m-2<k)ans=-1; 10 else if(n+m-2==k)ans=1; 11 else { 12 if(n-1>=k)ans=m*(n/(k+1)); 13 else if(n-1<k)ans=m/(k-n+2); 14 if(m-1<k)ans=max(ans,n/(k-m+2)); 15 else ans=max(ans,n*(m/(k+1))); 16 } 17 printf("%I64d\n",ans); 18 } 19 }