算法题目记录

1.最短距离 

 

题目简化:

明确问题 + 算法提示:

1.如何判断同类之间的最短距离为0 ---> 并查集+路径压缩

2.如何存储任意两类的距离 ---> 邻接矩阵存储无向图

3.如何表示每个点属于哪一类 ---> 用数组id[节点]存储属于哪一类

4.如何算出任意两类之间的最短距离 ---> 最短路问题:Floyd算法(多源汇最短路,多个起点)[动态规划]

详细思路:

并查集+路径压缩

int find(int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

Floyd算法

for (int t = 1; t <= k; t ++)
{
    for (int i = 1; i <= k; i ++)
    {
        for (int j = 1; j <= k; j ++)
        {
            d[i][j] = min(d[i][j], d[i][t] + d[t][j]);
        }
    }
}

代码: 

#include <iostream>
#include <cstring>

using namespace std;

const int N = 1e5 + 10, M = 510, INF = 0x3f3f3f3f;
int p[N], id[N];
int d[M][M]; //两个类之间的距离
int n, m, k;

int find(int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}
bool check()
{
    for (int i = 2; i <= n; i ++)
        if (id[i] == id[i - 1] && find(i) != find(i - 1))
            return false;
    return true;        
}
int main()
{

    cin >> n >> m >> k;
    for (int i = 1; i <= n; i ++) p[i] = i;
   
    for (int i = 1, j = 1; i <= k; i ++) 
    {
        int c;
        cin >> c;
        while (c --) id[j ++] = i;
    }
    
    memset(d, 0x3f, sizeof d);
    for (int i = 1; i <= k; i ++ ) d[i][i] = 0;
    
    for (int i = 1; i <= m; i ++)
    {
        int u, v, x;
        cin >> u >> v >> x;
        if (!x) p[find(u)] = find(v);
        int a = id[u], b = id[v];
        
        d[a][b] = d[b][a] = min(d[a][b], x);
    }
    if (!check()) puts("No");
    else
    {
        puts("Yes");
        for (int t = 1; t <= k; t ++)
        {
            for (int i = 1; i <= k; i ++)
            {
                for (int j = 1; j <= k; j ++)
                {
                    d[i][j] = min(d[i][j], d[i][t] + d[t][j]);
                }
            }
        }
        
        for (int i = 1; i <= k; i ++)
        {
            for (int j = 1; j <= k; j ++)
            {
                if (d[i][j] == INF) d[i][j] = -1;
                cout << d[i][j] << ' ';
            }
            cout << endl;
        }
    }
}


2.奶牛报数

题目简化:

        将这n头牛按顺时针围成一个圈,然后选定一头牛开始从1报数,所有的牛报完数,每一头牛都有相应的报的数字,当报到的数落在[l, r)区间中,则表示该牛被选中制作牛肉

        限制条件:所选牛的重量总和最大且第一头牛所报的数尽量小的方案

        求:第一头牛所报的数

明确问题 + 算法提示:

        1.如何表示按顺时针围成一圈的牛?---> 破环成链

        2.如何算出报数在区间内牛的重量总和?---> 区间和:前缀和

        3.如何算出第一头牛所报的数? ---> 通过第i头牛报的数,算出第1头牛所报的数

图解分析: 

代码: 

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;
int n, l, r;
int a[2 * N], s[2 * N];

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++)
    {
        cin >> a[i];
        a[i + n] = a[i];
    }
    
    //求前缀和
    for (int i = 1; i <= 2 * n; i ++) s[i] = s[i - 1] + a[i];
    
    cin >> l >> r;
    
    int len = r - l, res = -1, ans = 0;
    
    for (int i = 1; i <= 2 * n - len; i ++)
    {
        int sum = s[i + len - 1] - s[i - 1], idx = l - i + 1;
        while (idx < 1) idx += n;
        if (sum > ans || sum == ans && idx < res)
        {
            res = idx;
            ans = sum;
        }
    }
    cout << res << endl;
}


3.机器人跳跃问题

题目简化:

机器人初始有能量值e,机器人需要跳跃n个建筑,每个建筑有对应的高度,第i个建筑的高度

为h[i],机器人每次跳跃当前建筑,所花费的代价为e - h[i](即当e > h[i]时,能量增加e - h[i];当e < h[i]时,能量减少e - h[i]), 在每次跳跃后要保证能量值不能为负数

图示分析:

算法:递推 + 二分查找 

代码:

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;
int n, h[N];

bool judge(int e)
{
    for (int i = 1; i <= n; i ++)
    {
        e = 2 * e - h[i];
        if (e < 0) return  false;
        if (e >= N) return true;
    }
    return true;
}
int main()
{
    scanf ("%d", &n);
    for (int i = 1; i <= n; i ++) scanf ("%d", &h[i]);
    
    int l = 0, r = N;
    while (l < r)
    {
        int mid = (l + r) / 2;
        if (judge(mid)) r = mid;
        else l = mid + 1; 
    }
    
    cout << l << endl;
    return 0;
}

注意:题目均来自AcWing

所有笔记总结目录-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/656594.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言中的位段

位段是通过结构体实现的&#xff0c;可以在一定程度上减小空间浪费&#xff0c;位段的声明和结构体类似&#xff0c;有以下几个不同&#xff1a; ①位段的成员必须是整形&#xff08;int,char,short等&#xff09;。 ②成员后边有冒号和数字&#xff0c;表示该成员占几个bit位…

QA测试开发工程师面试题满分问答24: 用过哪些消息队列,各自的特点和优缺点是什么,结合项目实际说一说

回答思路 回答开头: 首先表达我对这个问题的认真态度,并表示我将根据自己的项目实践经验来回答。 列举使用过的消息队列: 根据我参与过的项目经验,我使用过以下几种主流的消息队列: RabbitMQApache KafkaRedis 的 pub/sub 功能 分别介绍各消息队列的特点: RabbitMQ: 特点: 基于…

Golang | Leetcode Golang题解之第104题二叉树的最大深度

题目&#xff1a; 题解&#xff1a; func maxDepth(root *TreeNode) int {if root nil {return 0}queue : []*TreeNode{}queue append(queue, root)ans : 0for len(queue) > 0 {sz : len(queue)for sz > 0 {node : queue[0]queue queue[1:]if node.Left ! nil {queue…

Matlab-熵权法

文章目录 熵权法一、模型简介二、例题1. 数据标准化2.指标的熵值和变异程度3.权重与评分4.代码实现 熵权法 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多…

大数据量上传FTP

背景 笔者有一个需求是把将近一亿条数据上传到FTP服务器中&#xff0c;这些数据目前是存储在mysql中&#xff0c;是通过关联几张表查询出来的&#xff0c;查询出来的数据结果集一共是6个字段。要求传输的时候拆分成一个个小文件&#xff0c;每个文件大小不能超过500M。我的测试…

迁移基于MicroBlaze处理器的设计

迁移基于MicroBlaze处理器的设计 生成系统基础设施&#xff08;MicroBlaze、AXI_Interconnect&#xff0c; Clk_Wiz、Proc_Sys_Reset&#xff09; 生成系统基础设施&#xff08;MicroBlaze、AXI_Interconnect、Clk_Wiz和 Proc_Sys_Reset&#xff09;&#xff1a; 1.使用所需的板…

多级留言/评论的功能实现——Vue3前端篇

文章目录 思路分析封装组件父组件模板逻辑样式 子组件——二级留言模板逻辑样式 子组件——三级留言以上模板逻辑样式 留言组件的使用 写完论文了&#xff0c;来把评论的前端部分补一下。 前端的实现思路是自己摸索出来的&#xff0c;没找到可以符合自己需求的参考&#xff0c;…

大数据技术之Scala语言,只需一篇文章即可,教你学会什么是Scala,教你如何使用Scala

一丶Scala入门 1.1什么是Scala Scala是Scalable Language两个单词的缩写&#xff0c;表示可伸缩语言的意思。从计算机的角度来讲&#xff0c;Scala是一门完整的软件编程语言&#xff0c;那么连在一起就表示Scala是一门可伸缩的软件编程语言。之所以说它是可伸缩&#xff0c;是…

软件需求分析和软件原型开发是一会事情吗?

软件需求分析和软件原型开发是软件开发过程中的两个重要环节&#xff0c;它们各自承担着不同的任务&#xff0c;但又紧密相连&#xff0c;共同影响着软件项目的成功。下面将详细解释这两个环节的定义、目的以及它们之间的关系。 一、软件需求分析 定义&#xff1a;软件需求分析…

怎样把学浪上的视频保存到电脑

我已经将学浪视频下载工具打包好了&#xff0c;有需要的下载下来 学浪下载工具打包链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.打开解压后的压缩包里面的N_m3u8D文件夹&#…

20道经典自动化测试面试题

概述 觉得自动化测试很难&#xff1f; 是的&#xff0c;它确实不简单。但是学会它&#xff0c;工资高啊&#xff01; 担心面试的时候被问到自动化测试&#xff1f; 嗯&#xff0c;你担心的没错&#xff01;确实会被经常问到&#xff01; 现在应聘软件测试工程师的岗位&…

AI图片生成软件怎么用?让你轻松完成创作

随着人工智能技术的不断发展&#xff0c;越来越多的AI应用进入我们的生活。使用AI图片生成软件来创作图片可以极大地简化创作过程&#xff0c;让设计师轻松实现各种艺术效果。那么AI图片生成软件怎么用? 1. 选择合适的AI图片生成软件 市场上有许多AI图片生成软件供选择&#x…

商品上线搜索服务

文章目录 1.引入检索页面1.确保search目录和list.html都成功引入2.修改list.html&#xff0c;增加命名空间3.后端编写接口 SearchController.java4.测试访问 2.带条件分页检索1.前端要求返回数据的格式2.构建vo&#xff0c;SearchResult.java3.SkuInfoService.java 购买用户根据…

RocketMQ学习(1) 快速入门

mq的一些前置知识和概念知识可以看这篇文章——SpringCloud入门(3) RabbitMQ&#xff0c;比如常见mq的对比等等&#xff0c;这篇文章不再赘述。 目录 RocketMQ概念、安装与配置docker配置 RocketMQ快速入门**同步消息消费模式 **异步消息*单向消息**延迟消息*顺序消息批量消息事…

通过提示工程将化学知识整合到大型语言模型中

在当今快速发展的人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;正成为科学研究的新兴工具。这些模型以其卓越的语言处理能力和零样本推理而闻名&#xff0c;为解决传统科学问题提供了全新的途径。然而&#xff0c;LLMs在特定科学领域的应用面临挑战&#…

力扣HOT100 - 1143. 最长公共子序列

解题思路&#xff1a; 动态规划 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…

【算法】位运算算法——两整数之和

题解&#xff1a;两整数之和(位运算算法) 目录 1.题目2.位运算算法3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.位运算算法 这个题目难点就在于不能用、- 那什么能够代替加号呢&#xff1f; 既然数的层面不能用号&#xff0c;那二进制的角度去用号即可。 恰好&a…

JavaScript(ES6)入门

ES6 1、介绍 ECMAScript 6&#xff08;简称ES6&#xff09;是于2015年6月正式发布的JavaScript 语言的标准&#xff0c;正式名为ECMAScript 2015&#xff08;ES2015&#xff09;。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语言。…

AAAI2024 基于扩散模型 多类别 工业异常检测 DiAD

前言 本文分享一个基于扩散模型的多类别异常检测框架&#xff0c;用于检测工业场景的缺陷检测或异常检测。 设计SG语义引导网络&#xff0c;在重建过程中有效保持输入图像的语义信息&#xff0c;解决了LDM在多类别异常检测中的语义信息丢失问题。高效重建&#xff0c;通过在潜…

mysql实战——Mysql8.0高可用之双主+keepalived

一、介绍 利用keepalived实现Mysql数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;两台Mysql数据库的数据保持完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库宕机…