2 条题解

  • 0
    @ 2025-10-8 16:57:53
    #include<bits/stdc++.h>
    using namespace std;
    const int N=510;
    int n,m,A,B,a[N][N],s[N][N];
    bool check(int x)
    {
        int now=0,sa=0;
        for (int i=1;i<=n;i++)
        {
            int sb=0;
            for (int j=1,t=0;j<=m;j++)
                if (t+(s[i][j]-s[i][j-1])-(s[now][j]-s[now][j-1])<x)
                    t+=(s[i][j]-s[i][j-1])-(s[now][j]-s[now][j-1]);
                else sb++,t=0;
            
            if (sb>=B)now=i,sa++;
        }
        return sa>=A;
    }
    int main()
    {   
        ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        cin>>n>>m>>A>>B;
        for (int i=1;i<=n;i++) for (int j=1;j<=m;j++)cin>>a[i][j];
        memset(s,0,sizeof(s));
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
                s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j]-s[i-1][j-1];
        int L=0,R=s[n][m],ans=0;
        while (L<=R)
        {
            int mid=(L+R)/2;
            if (check(mid)) L=mid+1,ans=mid;
            else            R=mid-1;
        }
        cout<<ans<<"\n";
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:57:43
      #include<bits/stdc++.h>
      using namespace std;
      const int N=510;
      int n,m,A,B,a[N][N],s[N][N];
      bool check(int x)
      {
          int now=0,sa=0;
          for (int i=1;i<=n;i++)
          {
              int sb=0;
              for (int j=1,t=0;j<=m;j++)
                  if (t+(s[i][j]-s[i][j-1])-(s[now][j]-s[now][j-1])<x)
                      t+=(s[i][j]-s[i][j-1])-(s[now][j]-s[now][j-1]);
                  else sb++,t=0;
              
              if (sb>=B)now=i,sa++;
          }
          return sa>=A;
      }
      int main()
      {
          ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
          cin>>n>>m>>A>>B;
          for (int i=1;i<=n;i++) for (int j=1;j<=m;j++)cin>>a[i][j];
          memset(s,0,sizeof(s));
          for (int i=1;i<=n;i++)
              for (int j=1;j<=m;j++)
                  s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j]-s[i-1][j-1];
          int L=0,R=s[n][m],ans=0;
          while (L<=R)
          {
              int mid=(L+R)/2;
              if (check(mid)) L=mid+1,ans=mid;
              else            R=mid-1;
          }
          cout<<ans<<"\n";
          return 0;
      }
      • 1

      *【二分】矩阵尽量平均分块[USACO11MAR] Brownie Slicing G

      信息

      ID
      1557
      时间
      1000ms
      内存
      128MiB
      难度
      10
      标签
      递交数
      1
      已通过
      1
      上传者