B. Nice Matrix (simulación + codicioso) Codeforces Ronda # 675 (Div.2)

Enlace a la pregunta original: https://codeforces.com/contest/1422/problem/B

Inserte la descripción de la imagen aquí
Muestra de prueba

entrada
2
4 2
4 2
2 4
4 2
2 4
3 4
1 2 3 4
5 6 7 8
9 10 11 18
salida
8
42

Nota

En el primer caso de prueba podemos, por ejemplo, obtener la siguiente matriz agradable en 8 operaciones:
2 2
4 4
4 4
2 2

En el segundo caso de prueba podemos, por ejemplo, obtener la siguiente matriz agradable en 42 operaciones:
5 6 6 5
6 6 6 6
5 6 6 5

Significado del título: dale n × mn \ times mnorte×m matriz, puede aumentar o disminuir cualquier elemento1 11 operación. Pregunte cuántas operaciones tiene que realizar al menos para que sea una buena matriz. La definición de matriz agradable es: cualquier fila o columna es una secuencia de palíndromo.

Ideas para la resolución de problemas: no piense en este problema demasiado complicado.Se puede resolver la operación de simulación directa + codicioso. ¿por qué? descubrimos,Cada elemento de la bonita matriz en realidad solo está relacionado con los otros dos elementos.Para un [i] [j] a [i] [j]a [ i ] [ j ] , entonces lo que está asociado esa [i] [m - j - 1] a [i] [mj-1]un [ i ] [ m-j-1 ]a [n - i - 1] [j] a [ni-1] [j]un [ n-yo-1 ] [ j ] (Mi subíndice predeterminado comienza desde 0). Estos tres elementos deben ser iguales, lo que significa que tenemos que cambiar estos tres elementos. Eso es. Entonces, ¿cómo se cambia para minimizar el número de operandos?Eso debe tomar el valor medio de los tres elementos como el valor de cierre y dejar que los otros dos elementos cambien. Conocemos este paso, luego podemos atravesar la matriz directamente, realizar dichas operaciones en cada elemento (cambiar el valor después de que se complete cada operación) y registrar los pasos de operación requeridos.

Código AC

/*
*邮箱:[email protected]
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include<bits/stdc++.h>	//POJ不支持

#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 103;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//

int t,n,m;
int a[maxn][maxn];
int main(){
    
    
	//freopen("in.txt", "r", stdin);//提交的时候要注释掉
	IOS;
	while(cin>>t){
    
    
		while(t--){
    
    
			cin>>n>>m;
			rep(i,0,n-1){
    
    
				rep(j,0,m-1){
    
    
					cin>>a[i][j];
				}
			}
			ll cnt=0;//记录操作步骤。
			//开始模拟操作。
			rep(i,0,n-1){
    
    
				rep(j,0,m-1){
    
    
					vector<int> temp;
					//我们现在所处理的是a[i][j],与它有关的就是a[i][m-j-1],a[n-i-1][j]。
					temp.push_back(a[i][j]);
					temp.push_back(a[i][m-j-1]);
					temp.push_back(a[n-i-1][j]);
					sort(temp.begin(),temp.end());
					//排列取中间值作为靠拢值。
					a[i][j]=a[i][m-j-1]=a[n-i-1][j]=temp[1];
					cnt+=(temp[2]-temp[1])+(temp[1]-temp[0]);
				}
			}
			cout<<cnt<<endl;
		}
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/hzf0701/article/details/108925564
Recomendado
Clasificación