您的位置:首页 > 其它

Jzzhu and Chocolate

2014-07-20 09:47 225 查看
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-2<k)ans=-1;
else if(n+m-2==k)ans=1;
else {
if(n-1>=k)ans=m*(n/(k+1));
else if(n-1<k)ans=m/(k-n+2);
if(m-1<k)ans=max(ans,n/(k-m+2));
else ans=max(ans,n*(m/(k+1)));
}
printf("%I64d\n",ans);
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: