天天看点

2018年东北农业大学春季赛校赛——wyh的矩阵

链接: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 ;
}