设为首页 加入收藏

TOP

分割矩阵 (二分范围[L,R))(一)
2013-01-01 14:49:56 来源: 作者: 【 】 浏览:500
Tags:分割 矩阵   二分 范围

 

  [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;

  }

 

      

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇动态数组的使用 下一篇C++开发那些dll和lib

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: