Loading

【牛客】美团2024年春招第一场笔试【技术】

【牛客】美团2024年春招第一场笔试【技术】

1. 小美的平衡矩阵

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<vector<int>> nums;
    for (int i = 0; i < n; i++) {
        fgetc(stdin);
        vector<int> nums_;
        for (int j = 0; j < n; j++) {
            int num = fgetc(stdin) - '0';
            nums_.push_back(num);
        }
        nums.push_back(nums_);
    }

    vector<vector<int>> pre(n + 1, vector<int>(n + 1, 0));
    for (int i = 1; i < n + 1; i++) {
        for (int j = 1; j < n + 1; j++) {
            pre[i][j] = pre[i][j - 1] + (pre[i - 1][j] - pre[i - 1][j - 1]) + nums[i - 1][j
                        - 1];
        }
    }

    vector<int> res(n, 0);
    for (int i = 2; i < n + 1; i++) {
        for (int j = 2; j < n + 1; j++) {
            for (int k = 2; k <= min(i, j); k += 2) {
                if (pre[i][j] - pre[i - k][j] - pre[i][j - k] + pre[i - k][j - k] == k * k /
                        2) {
                    res[k - 1] += 1;
                }
            }
        }
    }

    for (int i = 0; i < n; i++) {
        cout << res[i] << endl;
    }
    return 0;
}

思路:

  1. 因为矩阵只有0和1,所以可以使用二维前缀和,只占任意一个i*i矩阵,如果总和为i*i/2,则符合要求。
  2. 遍历整个矩阵,作为小矩阵的右下角,遍历可能的边长i,判断是否符合要求。

遇到的问题:

  1. 输入问题:做力扣习惯了,一开始直接使用int接受行,发现会溢出,需要用fgetc()一个一个接受。
posted @ 2024-05-05 15:20  杨谖之  阅读(133)  评论(0编辑  收藏  举报