每天一把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;
}