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 的差值越大即可。所以,我们总是把其中一维切完再切第二维。

 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 }
View Code

posted on 2014-07-20 09:47  天依蓝  阅读(223)  评论(0编辑  收藏  举报

导航