随笔 - 40  文章 - 0  评论 - 0  阅读 - 1190

【2022/03/13-第284场单周赛】复盘

总结

Q4临时找了堆优化的dijkstra,写成模板以后用了。

Q1.找出数组中的所有 K 近邻下标

对每个key值左右两边都标记(可以优化时间)。

class Solution {
public:
vector<int> findKDistantIndices(vector<int>& nums, int key, int k) {
int n = nums.size();
vector<int> h(n, 0);
for(int i = 0; i < n; ++i){
if(nums[i] == key){
for(int j = 0; j <= k; ++j){
if(i - j >= 0) h[i - j] = 1;
if(i + j < n) h[i + j] = 1;
}
}
}
vector<int> ret;
for(int i = 0; i < n; ++i){
if(h[i]) ret.push_back(i);
}
return ret;
}
};

Q2.统计可以提取的工件

标记所有挖过的格子,然后遍历工件。

class Solution {
public:
int digArtifacts(int n, vector<vector<int>>& artifacts, vector<vector<int>>& dig) {
int ret = 0;
set<pair<int, int>> digged;
for(auto i : dig){
digged.insert({i[0], i[1]});
}
for(auto i : artifacts){
int flag = 1;
int lupx = i[0], lupy = i[1], rdownx = i[2], rdowny = i[3];
for(int i = lupx; i <= rdownx; ++i){
for(int j = lupy; j <= rdowny; ++j){
if(digged.find({i, j}) == digged.end()){
flag = 0;
break;
}
}
}
ret += flag;
}
return ret;
}
};

Q3.K 次操作后最大化顶端元素

只有坐标为k-1的数没办法最后留在顶端。

class Solution {
public:
int maximumTop(vector<int>& nums, int k) {
int n = nums.size();
if(k == 0) return nums[0];
if(n == 1 && k & 1) return -1;
if(k == 1) return nums[1];
int mx = 0;
for(int i = 0; i < k - 1 && i < n; ++i){
mx = max(mx, nums[i]);
}
if(k < n) mx = max(mx, nums[k]);
return mx;
}
};

Q4.得到要求路径的最小带权子图

用dijkstra找到每个点到终点、起点1、起点2的距离,然后一一判断即可。

class Solution {
const long long INF = LONG_LONG_MAX / 3;
using PLL = pair<long, long>;
public:
int n;
void dijkstra(int s, vector<long long> &d, vector<vector<PLL>> &g){
priority_queue<PLL, vector<PLL>, greater<PLL>> q;
for(int i = 0; i < n; ++i) d[i] = INF; //看下标从0开始还是从1开始
d[s] = 0;
q.push({0, s});
while(!q.empty()){
int u = q.top().second;
long long du = q.top().first;
q.pop();
if(du != d[u]) continue;
for(int i = 0; i < g[u].size(); ++i){
int v = g[u][i].second;
long long dv = g[u][i].first;
if(d[v] > dv + du){
d[v] = dv + du;
q.push({d[v], v});
}
}
}
}
long long minimumWeight(int n, vector<vector<int>>& edges, int src1, int src2, int dest) {
this->n = n;
long long ret = LONG_LONG_MAX;
vector<long long> d0(n + 1, INF), d1(n + 1, INF), d2(n + 1, INF); // 数组大小要根据
vector<vector<PLL>> g(n + 1), rg(n + 1);
for(auto &i : edges){
g[i[0]].push_back({i[2], i[1]});
rg[i[1]].push_back({i[2], i[0]}); // 根据路径是单向还是双向来改
}
dijkstra(dest, d0, rg);
dijkstra(src1, d1, g);
dijkstra(src2, d2, g);
for(int i = 0; i < n; ++i){
long long t = d1[i] + d2[i] + d0[i];
if(t < ret) ret = t;
}
if(ret >= INF) return -1;
return ret;
}
};
posted on   damnglamour  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 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 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示