题目链接
题意:就是在一个矩阵中删去一行和一列,使得剩余的值最小。
题解:首先我们先意识到的是本题应该是没有重复的数的(虽然题目中好像没有说明,但是看了很多的题解好像都没有考虑),然后就是找到最大值和次大值,这里最大值是确定的,但是次大值是不确定的,因为次大值不知道是去掉最大值所在行还是列,所以这里我们要考虑到。在确定最次大值后, 还要进行暴力求是删去最大值的行或列,次大值的行或列。具体的在代码中有详细解释。
下面是AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1100;
int a[N][N];
int main()
{
int n,m;
cin>>n>>m;
int x,y;
int maxnum=-0x3f3f3f3f;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>a[i][j];
}
}
//找到最大值的行列
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(maxnum<a[i][j])
{
maxnum=a[i][j];
x=i;
y=j;
}
}
}
int max1=-0x3f3f3f3f;
int max2=-0x3f3f3f3f,xx,yy,xx2,yy2;
//找到去掉行的最大值
for(int i=1; i<=n; i++)
{
if(i==x) continue;
for(int j=1; j<=n; j++)
{
if(max1<a[i][j])
{
max1=a[i][j];
xx=i;
yy=j;
}
}
}
//找到去掉列的最大值
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(j==y) continue;
if(max2<a[i][j])
{
max2=a[i][j];
xx2=i;
yy2=j;
}
}
}
//假设max1!=max2说明必定有一个次大值与最大值在同一行或列,这样其实就确定了删去的行列
if(max1>max2) //去掉的是列
{
printf("%d %d\n",xx2,y);
}
else if(max1<max2) //去掉的是行
{
printf("%d %d\n",x,yy);
}
else if(max1==max2)//行列都行,需要暴力看是行还是列
{
max2=-0x3f3f3f3f;
max1=-0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
if(i==x) continue;
for(int j=1;j<=m;j++)
{
if(j==yy) continue;
if(a[i][j]>max1) max1=a[i][j];
}
}
for(int i=1;i<=n;i++)
{
if(i==xx) continue;
for(int j=1;j<=m;j++)
{
if(j==y) continue;
if(max2<a[i][j]) max2=a[i][j];
}
}
if(max1>max2) printf("%d %d\n",xx,y);
else printf("%d %d\n",x,yy);
}
return 0;
}