当前位置: 首页 > news >正文

7.13 note

lc749.dfs+simulate

通过设计数组记录,来进行大模拟

 

 

lc1806

模拟

math angel:可以用欧拉函数和费马小定理

 class Solution {

public:
int reinitializePermutation(int n) {
vector<int> perm(n);
iota(perm.begin(), perm.end(), 0);
int operations = 0;
bool flag = false;


while (!flag) {
operations++;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
if (i % 2 == 0) {
arr[i] = perm[i / 2];
} else {
arr[i] = perm[n / 2 + (i - 1) / 2];
}
}
perm = arr;
flag = isInitial(perm);
}
return operations;
}

    bool isInitial(vector<int> perm) {
int n = perm.size();
for (int i = 0; i < n; i++) {
if (perm[i] != i) {
return false;

}
}
return true;
}
};

lc787.

图论的记忆化搜索

class Solution {
private:
unordered_map<int, vector<pair<int, int>>> e;
int memo[101][101]; // 假设n和k不超过100
int dst;
int k_max;
const int INF = INT_MAX / 2; // 避免溢出

    int dfs(int u, int cnt) {
if (cnt > k_max + 1) {
return INF;
}
if (u == dst) {
return 0;
}
if (memo[u][cnt] != -1) {
return memo[u][cnt];
}
int ans = INF;
for (auto &edge : e[u]) {
int v = edge.first;
int w = edge.second;
ans = min(ans, dfs(v, cnt + 1) + w);
}
memo[u][cnt] = ans;
return ans;
}

public:
int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {
// 构建邻接表
for (auto &f : flights) {
int from = f[0];
int to = f[1];
int weight = f[2];
e[from].emplace_back(to, weight);
}
// 初始化记忆化数组
memset(memo, -1, sizeof(memo));
this->dst = dst;
this->k_max = k;
// 计算结果
int ans = dfs(src, 0);
return ans < INF ? ans : -1;
}
};

lc2101

引爆:建有向图+bfs

找出一系列炸弹中,引爆其中某一颗时能连锁引爆的最大数量。

步骤:

1. 建关系网:先判断每两颗炸弹之间的距离,如果距离小于其中A炸弹的半径,就记为“A能引爆B”,用一个网络(图)记录这种关系。有向图

 

2. 逐个试爆:对每一颗炸弹,模拟引爆它,然后用“广度优先搜索”(类似一层层扩散)统计能连锁引爆多少颗。


3. 找最大值:记录所有试爆中能引爆的最大数量,就是结果。

简单说就是:先搞清楚“谁能引爆谁”,再挨个试,看哪颗能炸得最多。

class Solution {

public:

    int maximumDetonation(vector<vector<int>>& bombs) {

        int n = bombs.size();

        vector<int> g[n];

        for (int i = 0; i < n - 1; ++i) {

            for (int j = i + 1; j < n; ++j) {

                auto& p1 = bombs[i];

                auto& p2 = bombs[j];

                auto dist = hypot(p1[0] - p2[0], p1[1] - p2[1]);

                if (dist <= p1[2]) {

                    g[i].push_back(j);

                }

                if (dist <= p2[2]) {

                    g[j].push_back(i);

                }

            }

        }

        int ans = 0;

        bool vis[n];

        for (int k = 0; k < n; ++k) {

            memset(vis, false, sizeof(vis));

            queue<int> q;

            q.push(k);

            vis[k] = true;

            int cnt = 0;

            while (!q.empty()) {

                int i = q.front();

                q.pop();

                ++cnt;

                for (int j : g[i]) {

                    if (!vis[j]) {

                        vis[j] = true;

                        q.push(j);

                    }

                }

            }

            if (cnt == n) {

                return n;

            }

            ans = max(ans, cnt);

        }

        return ans;

    }

};

 

http://www.dtcms.com/a/277026.html

相关文章:

  • 型模块化协作机器人结构设计cad【1张】三维图+设计说明书
  • 机器人猫咪能否温暖中老年孤独
  • 【Complete Search】-基础完全搜索-Basic Complete Search
  • 摩尔线程MUSA架构深度调优指南:从CUDA到MUSA的显存访问模式重构原则
  • Java: OracleHelper
  • Appium源码深度解析:从驱动到架构
  • Vue3 实现文件上传功能
  • HarmonyOS组件/模板集成创新活动-开发者工具箱
  • Vue配置特性(ref、props、混入、插件与作用域样式)
  • FusionOne HCI 23 超融合实施手册(超聚变超融合)
  • 第七章 算法题
  • NO.4数据结构数组和矩阵|一维数组|二维数组|对称矩阵|三角矩阵|三对角矩阵|稀疏矩阵
  • 电源中的声学-噪声,如何抑制开关电源的噪声
  • 飞算JavaAI:开启 Java 开发 “人机协作” 新纪元
  • 二叉树算法详解和C++代码示例
  • 项目合作复盘:如何把项目经验转化为可复用资产
  • 【C++】第十五节—一文详解 | 继承
  • ArkUI Inspector工具用法全解析
  • 【保姆级图文详解】Spring AI 中的工具调用原理解析,工具开发:文件操作、联网搜索、网页抓取、资源下载、PDF生成、工具集中注册
  • 在 JetBrains 系列 IDE(如 IntelliJ IDEA、PyCharm 等)中如何新建一个 PlantUML 文件
  • jEasyUI 创建带复选框的树形菜单
  • NLP-迁移学习
  • 【PyMuPDF】PDF图片处理过程内存优化分析
  • RHCIA第二次综合实验:OSPF
  • 电阻抗成像肺功能测试数据分析与直方图生成
  • 攻防世界——Web题 very_easy_sql
  • Rust 模块系统:控制作用域与私有性
  • python 虚拟环境 Anaconda Miniconda
  • 大模型的Temperature、Top-P、Top-K、Greedy Search、Beem Search
  • jeepay开源项目开发中金支付如何像其他支付渠道对接那样简单集成,集成服务商模式,极简集成工具。