360笔试9.9

第一题为输出每个宝藏能在第几天打开
#include<bits/stdc++.h>
using namespace std;
int main () {
    int n;
    cin>>n;
    vector<int>arr(n, 0);
    int begin = -1;
    unordered_map<int, bool>mp; // 已经拥有的钥匙
    bool flag = false;
    for (int i = 0; i < n; ++i) {
        cin>>arr[i];
        if (arr[i] == 1) {
            begin = i + 1;
            flag = true;
        }
        if (!flag) {
            mp[arr[i]] = true;
        }
    }
    vector<int>res(n + 1, -1);
    res[1] = begin;
    int nextDoor = 2;
    for (int i = begin; i < n; ++i) {
        while(mp[nextDoor]) {
            res[nextDoor] = begin;
            nextDoor++;
        }
        begin++;
        mp[arr[i]] = true;
    }
    while(mp[nextDoor]) {
        res[nextDoor] = begin;
        nextDoor++;
    }
    for (int i = 1; i <= n; ++i) {
        cout<<res[i]<<" ";
    }
    return 0;
}

第二题为求出正方形区域最大的和
//
// Created by Lenovo on 2022/9/9.
//
// 动态规划!!! 
#include<bits/stdc++.h>
using namespace std;
int main () {
    int t;
    cin>>t;
    while (t--) {
        int n, m;
        cin>>n>>m;
        vector<vector<int>> arr(n, vector<int>(m, 0));
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                cin>>arr[i][j];
            }
        }
        vector<vector<int>> dp(n, vector<int>(m, 0));
        int res = 0;
        // 先记住边长,然后在计算数字之和!!! 时间复杂度也是一样的!!
        // 不为-1就可以组成正方形!!
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (i == 0 || j == 0) {
                    dp[i][j] = arr[i][j] == -1 ? 0 : 1;
                } else {
                    if (arr[i][j] == -1) {
                        dp[i][j] = 0;
                    } else {
                        dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
                    }
                }
            }
        }

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (dp[i][j] == 0) {
                    continue;
                }
                int row = i - dp[i][j] + 1;
                int col = j - dp[i][j] + 1;
                int tmpres = 0;
                for (int q = row; q <= i; q++) {
                    for (int w = col; w <= j; w++) {
                        tmpres += arr[q][w];
                    }
                }
                res = max(res, tmpres);
            }
        }
        cout<<res<<endl;
    }
}
两题都是middle
#360笔试#
全部评论

相关推荐

01-16 18:48
四川大学 Java
KalznAsawind:人问他哪一个是pdd,他倒介绍起来了。。。
点赞 评论 收藏
分享
评论
2
5
分享

创作者周榜

更多
牛客网
牛客企业服务