链接:https://ac.nowcoder.com/acm/problem/231336 来源:牛客网

解题思路:先定义一个二维数组,存储数据,并另外定义两个数组分别存储每一行,每一列的数据,最后找某一行加某一列并减去重复位置的数后的最大值,即为题目所求

using namespace std;
int main()
{
    int a,b,max=0,m=0,f,k;
    cin>>a>>b;
    int s[4000][4000]={};
    int c[100000]={},d[100000]={};
    for(int i=0;i<a;i++)
    {
        for(int j=0;j<b;j++)
        {
            cin>>s[i][j];
            c[i]+=s[i][j];
        }
    }
    for(int j=0;j<b;j++)
    {
        for(int i=0;i<a;i++)
        {
            d[j]+=s[i][j];
        }
    }
    for(int i=0;i<a;i++)
    {
        if(c[i]>max)
        {
            max=c[i];
            k=i;
        }
    }
    for(int j=0;j<b;j++)
    {
        if(d[j]>m)
        {
            m=d[j];
            f=j;
        }
    }
    cout<<max+m-s[k][f];
    return 0;
}

第一次的提交:结果为运行超时;

原因:在输入大量数据时,cin会比scanf慢四五倍;

第二次的提交:结果为只通过了87%的测试数据;

原因:再对比了别人的代码后发现了一个微乎其微的问题,看似大体上没啥问题,但是按照我的代码忽略了一种可能:(设中间一行为和最大的一行)

         2  233
   0 1 1 233 3
         3   2
  

也就是说所显示的两列其实是一样大,但是由于第四列在前,所以标记也只会标记第四列,计算结果第四列:243,第五列:473,显而易见应该输出473,但实际代码会输出243,即错误所在;

修改后:

using namespace std;
int main()
{
    int a,b,max=0,m=0,f,k,sum=0;
    cin>>a>>b;
    int s[4000][4000]={};
    int c[100000]={},d[100000]={};
    for(int i=0;i<a;i++)
    {
        for(int j=0;j<b;j++)
        {
            scanf("%d",&s[i][j]);
            c[i]+=s[i][j];
        }
    }
    for(int j=0;j<b;j++)
    {
        for(int i=0;i<a;i++)
        {
            d[j]+=s[i][j];
        }
    }
    for(int i=0;i<a;i++){
        for(int j=0;j<b;j++){
            sum=c[i]+d[j]-s[i][j];
            if(sum>max)max=sum;
        }
    }
    printf("%d",max);
    return 0;
}