题解:P16849 [GKS 2021 #D] Arithmetic Square
题目传送门 & 更好的阅读体验
我们考虑可能生成等差数列的情况,第一种就是给定的元素中已经生成,那么我们可以直接计数;第二种是通过中间行列或对角线生成的,这类等差数列需要依赖中心值。
我们先来考虑如何判断序列
接着我们来考虑当
例如对于样例的第一组数据
中,直接由给定的元素中生成的等差数列有
最后注意一下小心
::::success[AC 代码]{open}
#include <bits/stdc++.h>
#define int long long
using namespace std;
int T, ans, val[10], g[10][10];
signed main()
{
cin.tie(0) -> sync_with_stdio(false);
cin >> T;
for (int cs = 1; cs <= T; cs++)
{
ans = 0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
if (!(i == 1 && j == 1)) cin >> g[i][j]; // 输入 g,跳过中间值
ans += (g[0][2] - g[0][1] == g[0][1] - g[0][0]);
ans += (g[2][2] - g[2][1] == g[2][1] - g[2][0]);
ans += (g[2][0] - g[1][0] == g[1][0] - g[0][0]);
ans += (g[2][2] - g[1][2] == g[1][2] - g[0][2]);
// 计算直接由给定的元素中生成的等差数列数量
val[1] = g[1][2] + g[1][0];
val[2] = g[2][1] + g[0][1];
val[3] = g[2][2] + g[0][0];
val[4] = g[0][2] + g[2][0];
// 计算 4 个 x
int maxn = 0, cnt;
for (int i = 1; i <= 4; i++)
{
int num = val[i];
// 分别将 4 个 x 作为相等值计算
if (num % 2) continue; // 跳过分数情况!
cnt = 0;
cnt += (val[1] == num);
cnt += (val[2] == num);
cnt += (val[3] == num);
cnt += (val[4] == num);
maxn = max(maxn, cnt);
// 取中间行列和对角线得到的等差数列数量的最大值
}
ans += maxn;
cout << "Case #" << cs << ": " << ans << '\n'; // 记得按格式输出
}
return 0;
}
::::