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笔试#
全部评论

相关推荐

09-18 14:30
门头沟学院 Java
mountisome:去骗吃骗喝是吧,学到了
我的秋招日记
点赞 评论 收藏
分享
09-12 11:55
已编辑
湖南工商大学 Java
那一天的Java_J...:这种一堆问题的,别去
点赞 评论 收藏
分享
08-08 16:33
唐山学院 Java
职场水母:首先,简历太长,对于实习和应届找工作,hr一眼扫的是学历,技术看实习,你写的技术栈字太多了,尽量用一句话概括不用写那么详细,技术面的时候会问的,而且技术栈都会在实习或者项目里体现,你要做的是,把你的简历浓缩为一页,删除没用的东西,比如实践经历,自我评价,这些纯废话,没用,专业技能写的太离谱,你真的熟练掌握了吗,建议都写熟悉,找工作和写论文不一样,追求的是干练和实用,把实习经历和项目提前,把掌握的技术栈写到最后,然后去找实习,
点赞 评论 收藏
分享
09-18 15:39
门头沟学院 Java
小肥罗:感谢信+10086
点赞 评论 收藏
分享
评论
2
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务