链接:https://www.nowcoder.com/acm/contest/93/B
来源:牛客网
给你一个n*n矩阵,按照顺序填入1到n*n的数,例如n=5,该矩阵如下
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
现在让你连接相邻两条边的中点,然后只保留他们围成封闭图形区域的数字,那么这个矩阵变为
3
7 8 9
11 12 13 14 15
17 18 19
23
现在你们涵哥让你求变化后的矩阵的所有元素的和为多少
此题若是构建数组,通过规律取数组元素求和的话,会报错——内存超限。
所以此题的解法是寻找规律,总结数学公式求解。
#include<iostream>
using namespace std;
int main()
{
long long sum;
long long T,n,i,j,k;
cin >> T;
while (T--)
{
sum = ;
cin >> n;
if (n % ==)
{
sum = (n + ) / ;
for (i = ; i <= n / ; i++)
sum += (n + ) / + n * i + (( * i + )*n + )*i;
for (i = n / + ; i <n; i++)
sum += (n + ) / + n * i + (( * i + )*n + )*(n - - i);
//sum += (n + 1) / 2 + n * (n - 1);
cout << sum << endl;
}
}
return ;
}
//内存超限
#include<iostream>
using namespace std;
const int MAX = ;
int m[MAX][MAX];
int main()
{
int T, n, i, j, k;
int sum1,sum2;
int v;
cin >> T;
while (T--)
{
sum1 = ;
sum2 = ;
cin >> n;//n-1,n/2
v = ;
for (i = ; i < n; i++)
{
for (j = ; j < n; j++)
{
m[i][j] = v;
v++;
}
}
for (i = ; i <=n/; i++)
for (j = n / - i, k = ; k <= i * + ; j++,k++)
sum1 += m[i][j];
for (i = n - ; i > n / ; i--)
for (j = n / - (n--i), k = ; k <= (n--i) * + ; j++, k++)
sum2 += m[i][j];
cout << sum1+sum2<<endl;
}
//cout << sum << endl;
system("pause");
return ;
}