分割矩阵 (二分范围[L,R))(一)

2013-01-01 14:49:56 · 作者: · 浏览: 515

 

  [cpp]

  #include<cstdio>

  #include<cstring>

  #include<cmath>

  #include<cstdlib>

  #include<iostream>

  #include<functional>

  #include<algorithm>

  using namespace std;

  #define MAXN (500+10)

  #define MAXM (500+10)

  #define MAXT (2000000+10)

  int n,m,t1,t2,a[MAXN][MAXM],sum[MAXN][MAXM]={0};

  bool is_ok(int l,int r,int _m)

  {

  int tot=0,p=0;

  for (int i=1;i<=m;i++)

  {

  tot+=sum[r][i]-sum[l-1][i];

  if (tot>=_m) {tot=0;p++;}

  }

  if (p>=t2) return 1;

  else return 0;

  }

  bool is_ok_(int _m)

  {

  int p=0,l=1;

  for (int i=1;i<=n;i++)

  {

  if (is_ok(l,i,_m)) {l=i+1;p++;}

  }

  if (p>=t1) return 1;

  else return 0;

  }

  int main()

  {

  freopen("browine.in","r",stdin);

  freopen("browine.out","w",stdout);

  scanf("%d%d%d%d",&n,&m,&t1,&t2);

  for (int i=1;i<=n;i++)

  for (int j=1;j<=m;j++)

  {

  scanf("%d",&a[i][j]);

  sum[i][j]=sum[i-1][j]+a[i][j];

  }

  /*

  for (int i=1;i<=n;i++)

  for (int j=1;j<=m;j++)

  {

  printf("%d ",sum[i][j]);

  }

  */

  //  cout《(is_ok_(4));

  int l=1,r=1,ans=0;

  for (int j=1;j<=m;j++) r+=sum[n][j];

  for (int i=1;i<=60;i++)

  {

  int m_=(l+r)/2;

  if (is_ok_(m_)) {l=ans=m_;}

  else r=m_;

  }

  printf("%d\n",ans);

  //  while (1);

  return 0;

  }