当前位置: 代码迷 >> 综合 >> Nice Matrix - 每天一把CF - 20201012
  详细解决方案

Nice Matrix - 每天一把CF - 20201012

热度:0   发布时间:2024-02-27 20:19:02.0

每天一把CF : 2020-10-12

文章目录

    • 题目
    • 思路
    • 代码实现

题目

原题链接:https://codeforces.com/problemset/problem/1422/B

在这里插入图片描述

思路

题目大意:给你一个n*m的矩阵,有一操作-将矩阵中任意一个元素加减1,问最少多少步能将这个矩阵变成一个从行从列都是回文数字的"漂亮"矩阵。

思路:回文回文,就是关于中心对称的四个点值相同罢了,找出那个能在最少步数达到的数就好了。

在这里插入图片描述

一开始我想的是平均数,最后wa了样例2并且写了个小程序才发现是中位数。

最后注意一下奇偶行列数就好了。

1300水题一道。

代码实现

#include <iostream>
#include <set>
using namespace std;#define MAX 105
#define ll long longll mp[MAX][MAX], t, n, m;
ll ans, sum;ll fun1(ll a, ll b, ll c, ll d) {
    ll arr[4] = {
     a,b,c,d };ll temp;for (int i = 0; i < 3; i++){
    for (int j = 0; j < 3 - i; j++){
    if (arr[j] > arr[j + 1]){
    temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}a = arr[0], b = arr[1], c = arr[2], d = arr[3];return c - b + d - a;return 0;
}ll fun2(ll a, ll b) {
    return abs(a - b);
}int main()
{
    ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);/*ll a, b, c, d;cin >> a >> b >> c >> d;fun1(a, b, c, d);*/cin >> t;while (t--){
    ans = 0;cin >> n >> m;int i, j;for (i = 1; i <= n; i++)for (j = 1; j <= m; j++)cin >> mp[i][j];int f1 = (n % 2 ? n / 2 + 1 : n / 2), f2 = (m % 2 ? m / 2 + 1 : m / 2);for (i = 1; i <= f1; i++)for (j = 1; j <= f2; j++){
    if (n % 2 && i == f1 && m % 2 && j == f2)continue;if (n % 2 && i == f1){
    ans += fun2(mp[i][j], mp[i][m - j + 1]);}else if (m % 2 && j == f2){
    ans += fun2(mp[i][j], mp[n - i + 1][j]);}else{
    ans += fun1(mp[i][j], mp[n - i + 1][j], mp[i][m - j + 1], mp[n - i + 1][m - j + 1]);}}cout << ans << endl;}return 0;
}
  相关解决方案