当前位置: 代码迷 >> 综合 >> SDUT 2022 Winter Individual Contest - E ( H - Perfect Ban )
  详细解决方案

SDUT 2022 Winter Individual Contest - E ( H - Perfect Ban )

热度:16   发布时间:2023-11-29 20:36:34.0

题目链接
题意:就是在一个矩阵中删去一行和一列,使得剩余的值最小。
题解:首先我们先意识到的是本题应该是没有重复的数的(虽然题目中好像没有说明,但是看了很多的题解好像都没有考虑),然后就是找到最大值和次大值,这里最大值是确定的,但是次大值是不确定的,因为次大值不知道是去掉最大值所在行还是列,所以这里我们要考虑到。在确定最次大值后, 还要进行暴力求是删去最大值的行或列,次大值的行或列。具体的在代码中有详细解释。
下面是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;
}
  相关解决方案