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笔试#
查看14道真题和解析
