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 = 0;
        cin >> n;
        if (n % 2==1)
        {
            sum = (n + 1) / 2;
            for (i = 1; i <= n / 2; i++)
                sum += (n + 1) / 2 + n * i + ((2 * i + 1)*n + 1)*i;
            for (i = n / 2 + 1; i <n; i++)
                sum += (n + 1) / 2 + n * i + ((2 * i + 1)*n + 1)*(n - 1 - i);
            //sum += (n + 1) / 2 + n * (n - 1);
            cout << sum << endl;
        }
    }

    return 0;
}
//内存超限
#include<iostream>
using namespace std;
const int MAX = 10001;
int m[MAX][MAX];
int main()
{
    int T, n, i, j, k;
    int sum1,sum2;
    int v;
    cin >> T;
    while (T--)
    {
        sum1 = 0;
        sum2 = 0;
        cin >> n;//n-1,n/2
        v = 1;
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                m[i][j] = v;
                v++;
            }
        }
        for (i = 0; i <=n/2; i++)
            for (j = n / 2 - i, k = 1; k <= i * 2 + 1; j++,k++)
                sum1 += m[i][j];
        for (i = n - 1; i > n / 2; i--)
            for (j = n / 2 - (n-1-i), k = 1; k <= (n-1-i) * 2 + 1; j++, k++)
                sum2 += m[i][j];
        cout << sum1+sum2<<endl;
    }
    //cout << sum << endl;
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weifuliu/article/details/79829245