第24题(二分):巧克力蛋糕



Description

有一块矩形的巧克力蛋糕,我们可以把它看成是R×C(1<=R,C<=500)个小网格,每个网格上有N_ij(0<=N_ij<=4,000)颗巧克力豆。
现在我们将这块蛋糕切成A×B(1<=A<=R,1<=B<=C)块。先沿水平方向切A-1刀(沿着网格线),得到A条蛋糕,然后对于每条蛋糕,独立的沿垂直方向切B-1刀(沿着网格线)。蛋糕切好后,很快就被分掉了,只留下最后一块给你。由于人人都爱吃巧克力豆,因此,每个人拿蛋糕的时候都会选择巧克力豆最多的那块。当然,你也想要吃到尽可能多的巧克力豆。
请你设计一个切蛋糕的方案,使得自己可以吃到尽可能多的巧克力豆。

Input

输入数据共若干行。第一行包含四个用空格隔开的整数R、C、A、B。接下来R行,每行包含C个用空格隔开的整数N_ij。

Output

输出数据仅一个整数,表示可能得到的最多巧克力豆的数量。

Sample Input

5 4 4 2
1 2 2 1
3 1 1 1
2 0 1 3
1 1 1 1
1 1 1 1

Sample Output

3

AC CODE:

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1001
int a[MAXN][MAXN],n,m,x,y,sum,s;
int check(int h){
    int last=0,sum=0,xx=0,yy=0;
    for(int i=1;i<=n;++i){
        yy=0;sum=0;
        for(int j=1;j<=m;++j){
            sum+=a[i][j]-a[last][j];
            if(sum>h)yy++,sum=0;
            if(yy>=y) break;
        }
        if(yy>=y)last=i,xx++;
        if(xx>=x)return 1;
    }
    return 0;
}  
int main(){
    cin>>n>>m>>x>>y;
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j){
        cin>>s;
        sum+=s;
        a[i][j]=a[i-1][j]+s;
    }
    int l=0,r=sum/x/y;
    while(l<r){
        int mid=(l+r)/2;
        if(check(mid)==1)l=mid+1;
        else r=mid;
    }
    cout<<r<<endl;
}

阅读更多
个人分类: 呵呵
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭