链接: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;
}