2024-09-08 小红书机试 解题报告 | 珂学家

news2024/9/22 19:33:00

前言

在这里插入图片描述


题解

这是2024年9月8号的小红书机试题。

看到群里有人在讨论,小红书的机试题,顺手做了下,感觉挺有意思的。

现在的机试题,是真的难,好卷。


A. 机器人

题目描述:
m * n的格子,都有一个方向指令LRUD。而每个格子上的机器人必须按格子的方向指令行走,求最后还留在格子里的机器人数。
初始时,每个格子上都有一个机器人,且行动彼此不受影响。

输入

2 5
LRRLR
UULLR

输出

6

思路: 正向遍历/逆向拓扑排序

这类激光反射格子的题,有一些经典的结论:

  • 每条路径彼此独立,没有交集
  • 每条路径要么有一个环,要么从矩阵边界出去

所以图中,可以剥离出,基环树 和 单链 两种类型。

而最终能剩下的机器人,就是在基环树的格子上。


从逆向的角度求解,就是拓扑排序

我们把每个格子抽象为一个节点,
图中每个节点只有一条出边 ( 出界不算 ) ,即出度为 1 图中每个节点只有一条出边(出界不算),即出度为1 图中每个节点只有一条出边(出界不算),即出度为1

逆向建图,即出边构建反向边,然后跑一遍拓扑排序,这样就可以把哪些 单向链 求解出来。

这样的时间复杂度为 O ( n ∗ m ) O(n*m) O(nm)

#include <bits/stdc++.h>

using namespace std;

int main() {
    
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    
    int h, w;
    cin >> h >> w;
    vector<string> grid(h);
    for (int i = 0;i < h; i++) {
        cin >> grid[i];
    }
    
    // 反向构建拓扑图
    vector<vector<int>> deg(h, vector<int>(w, 0));
    vector<vector<vector<int>>> g(h, vector<vector<int>>(w));
    
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            char c = grid[i][j];
            if (c == 'L') {
                if (j > 0) {
                    g[i][j - 1].push_back(i * w + j);
                    deg[i][j - 1]++;
                }
            } else if (c == 'R') {
                if (j + 1 < w) {
                    g[i][j + 1].push_back(i * w + j);
                    deg[i][j + 1]++;
                }
            } else if (c == 'U') {
                if (i > 0) {
                    g[i - 1][j].push_back(i * w + j);
                    deg[i - 1][j]++;
                }
            } else if (c == 'D') {
                if (i + 1 < h) {
                    g[i + 1][j].push_back(i * w + j);
                    deg[i + 1][j]++;
                }
            }
        } 
    }
    
    // 拓扑排序板子
    deque<array<int, 2>> que;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            if (deg[i][j] == 0) {
                que.push_back({i, j});
            }
        }
    }
    int ans = 0;
    while (!que.empty()) {
        auto cur = que.front();
        que.pop_front();
        ans++;
        int y = cur[0], x = cur[1];
        for (int v: g[y][x]) {
            int ty = v / w, tx = v % w;
            if (--deg[ty][tx] == 0) {
                que.push_back({ty, tx});
            }
        }
    }
    
    cout << (h * w - ans) << endl;
    return 0;
    
}

从正向的角度,就是遍历,由于只有一个出口,所以单纯的for循环即可。

这里需要染色去重,时间复杂度也为 O ( n ∗ m ) O(n*m) O(nm).

感觉正向去编写,更快更便捷。


B. 小苯的区间之和

题目描述:

可以重排数组,使得

∑ i = 0 i = n ∑ j = i j = n f ( i , j ) 最小, f ( i , j ) 为子数组 [ i , j ] 的区间和 \sum_{i=0}^{i=n}\sum_{j=i}^{j=n} f(i, j) 最小,f(i, j) 为子数组[i, j]的区间和 i=0i=nj=ij=nf(i,j)最小,f(i,j)为子数组[i,j]的区间和

思路: 贡献法

就是统计每个元素,在所有的子数组的次数

w i = ( i + 1 ) ∗ ( n − i ) w_i = (i + 1) * (n - i) wi=(i+1)(ni)

重新排列值,求最小的所有子数组和?

那贪心得到,高权重配低数值,这样必然结果最小。

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
    }
    
    // 计算贡献
    vector<int64_t> w(n);
    for (int i = 0; i < n; ++i) {
        w[i] = (int64_t)(i + 1) * (n - i);
    }

    sort(w.begin(), w.end());
    sort(arr.rbegin(), arr.rend());

    // 逆向配对
    int64_t ans = 0;
    for (int i = 0; i < n; ++i) {
        ans += (int64_t)w[i] * arr[i];
    }

    cout << ans << endl;
    return 0;
}

C. 小红的笔记精选

题目描述:

简单来说,就是寻找最长的序列,其满足

  • 该序列中每个元素的二进制1的个数都相等
  • 该序列满足自然递增

思路: 分组+Map/构造

就是按照二进制的1个数,分组

然后每个分组,构建寻找最长的连续序列

其实难点在于,如何构造某数的下一个值。

我是刷表法构造的

对于值x

  1. 添加 lowbit = x & -x
  2. 从末尾出发,补足下一个数的二进制的1个数
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cstdio>

using namespace std;

int main() {
    int n;
    scanf("%d", &n);
    unordered_map<int, vector<long long>> hp;

    for (int i = 0; i < n; i++) {
        long long v;
        scanf("%lld", &v);
        int cnt = __builtin_popcountll(v);
        hp[cnt].push_back(v);
    }

    int res = 0;

    for (auto& ent : hp) {
        vector<long long>& lst = ent.second;
        sort(lst.begin(), lst.end());

        int nk = ent.first;
        unordered_map<long long, int> dp;
        for (auto& v : lst) {
            dp[v] = 1;
        }

        for (auto& v : lst) {
            int z = dp[v];
            res = max(res, z);

            long long low = v & (-v);
            long long nv = v + low;
            int n1 = __builtin_popcountll(nv);
            
            for (int i = 0; n1 < nk && i < 30; i++) {
                if (n1 < nk) {
                    if (((1LL << i) & nv) == 0) {
                        nv |= (1LL << i);
                        n1++;
                    }
                }
            }

            if (dp.find(nv) != dp.end()) {
                dp[nv] = max(dp[nv], z + 1);
            }
        }
    }

    printf("%d\n", res);

    return 0;
}

写在最后

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

挑战当前最难、规模最大多模态评测基准MME-RealWorld,QwenVL-2位列第一但并未及格

32 个标注者&#xff0c;29,429 条标注数据&#xff0c;图像平均分辨率 20001500&#xff0c;当前最难最大的纯手工标注图像感知 benchmark 来了&#xff01;现有模型没有一个在总分上取得 60% 以上的准确率。 论文链接&#xff1a; https://arxiv.org/abs/2408.13257 项目主…

MLLM(三)| BigModel平台正式上线Plus系列全家桶

2024年8月28日&#xff0c;在ACM SIGKDD&#xff08;国际数据挖掘与知识发现大会&#xff0c;KDD&#xff09;会议现场&#xff0c;智谱AI重磅推出新一代全自研基座大模型GLM-4-Plus、图像/视频理解模型GLM-4V-Plus和文生图模型CogView-3-Plus。 1、模型介绍页&#xff1a;htt…

Maven项目父模块POM中是否应该包含SpringBoot打包插件(spring-boot-maven-plugin)

父模块POM是否包含SpringBoot打包插件 一、场景 一个基于SpringBoot的Maven父子模块的项目&#xff08;一个父项目中包含多个子项目&#xff09;&#xff0c;父模块 POM文件中&#xff0c;是否应该包含打包需要的插件&#xff08;spring-boot-maven-plugin&#xff09;&#…

strcat函数的使用和模拟实现

目录 1.头文件 2.函数功能​编辑 3.注意事项&#xff1a; 4.strcat函数模拟实现&#xff1a; 方源一把抓住VS2022&#xff0c;催动春秋产的气息&#xff0c;顷刻炼化&#xff01; 1.头文件 strcat函数的使用&#xff0c;需要头文件 #include<string.h>2.函数功能 s…

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

Course1-Week1: https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Supervised%20Machine%20Learning%20Regression%20and%20Classification/week11️⃣线性回归&#xff08;linear regression&#xff09; f w , b ( x ) w x b f_{w,b}(x) wx b …

【深度学习讲解笔记】前言

小编为AI专业的本科学生&#xff0c;最近入手了一本《深度学习讲解》的书&#xff0c;由于封面画了苹果&#x1f34e;&#xff0c;所以也叫苹果书&#xff0c;这本书目前在全网的热度很高。 本书是根据李宏毅老师讲授的《机器学习》课程编写的&#xff0c;作者是来自DataWhale…

SCI顶刊中“introduction”经典模板,建议收藏!

Introduction Introduction 的行文框架是一个从较宽泛的学术领域逐渐缩小到你的研究目标的过程。 1.研究背景和重要性 (Background AndImportance) • Mention of previous work on the subject • A statement of the importance of the subject 引言部分的第一段需要给出…

(Charles)如何抓取手机http的报文

抓包的目的&#xff1a; 发现bug需要定位要抓包 检查数据传输的安全性 接口测试遇到需求文档不全要抓包 抓包主要抓取的是http协议&#xff08;https协议&#xff09;的报文 http协议规范客户端和服务端的数据传输格式&#xff0c;是一个标准和规范 每个http连接包括请求消息和…

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya&#xff08;不是本人&#xff0c;claude AI&#xff09;在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容&#xff1a; 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用&…

CSP-J基础之数学基础 杨辉三角 一篇搞懂

文章目录 前言杨辉三角介绍杨辉三角的结构数学中的形式杨辉三角的性质 杨辉三角进行左对齐杨辉三角的递推公式编程实现杨辉三角总结 前言 杨辉三角是数学中一个非常有趣且重要的概念。它不仅在组合数学中扮演着重要角色&#xff0c;还在许多数学问题的解决中提供了有力的工具。…

【重学 MySQL】二十、运算符的优先级

【重学 MySQL】二十、运算符的优先级 MySQL 运算符的优先级&#xff08;由高到低&#xff09;注意事项示例 在 MySQL 中&#xff0c;运算符的优先级决定了在表达式中各个运算符被计算的先后顺序。了解运算符的优先级对于编写正确且高效的 SQL 语句至关重要。以下是根据高权威性…

Rust运算符

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) https://blog.csdn.net/brucexia/category_12779443.html 前面已经学习了变量和常量&#xff0c;本节开始对它们进行操作&#xff0c…

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站&#xff0c;手机流量可以访问IPV6网络的服务&#xff0c;为什么不在电脑搭建Home Assistant&am…

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为&#xff1a; 创建一个socket服务端&#xff0c;监听socket通道&#xff0c;并打印出socket通道中的内容。 创建两个socket客户端&#xff0c;向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void m…

Linux服务器应急响应(上)

目录 介绍步骤 介绍 网页篡改&#xff0c;即攻击者故意篡改网络上传送的报文&#xff0c;通常以入侵系统并篡改数据、劫持网络连接或插入数据等形式进行。 网页篡改一般有明显式和隐藏式两种。明显式网页篡改指攻击者为炫耀自己的技术技巧&#xff0c;或表明自己的观点实施的网…

《深入浅出WPF》读书笔记.11Template机制(下)

《深入浅出WPF》读书笔记.11Template机制(下) 背景 本文主要讲datatemplate和contenttemplate的联合使用&#xff0c;以及style的解析。 《深入浅出WPF》读书笔记.11Template机制(下) 代码 两者的作用域范围 datatemplate和contenttemplate的关系 两者的应用 指定目标类型…

Qt常用控件——QPushButton

QPushButton介绍 QWidget中涉及到的各种属性、函数、使用方法&#xff0c;对于Qt的各种控件都是有效的 使用QPushButton表示一个按钮&#xff0c;继承自QAbstracButton&#xff0c;这个类是一个抽象类 抽象类&#xff1a;包含纯虚函数&#xff0c;无法实例化出对象&#xff0c;…

第四届长城杯部分wp

还是太菜了&#xff0c;要经常练了 1.BrickGame 通过游戏就可以得到flag 2.SQLUP 一道文件上传的题目&#xff0c;在登陆页面我用admin和1登陆成功了&#xff0c;但是按照正常的应该是要爆破&#xff0c;用bp爆破得到下面的页面 登陆成功后&#xff0c;点击头像就可以进行文…

前端 PDF 预览技巧:标签 vs 插件,如何优雅地展示 PDF 文件

前言 pdf 作为一种常用的文档格式&#xff0c;相信很多同学都在项目中遇到过需要预览 pdf 文件的情况。其实实现的方式有很多&#xff0c;包括传统的标签 iframe 或 embed 方式&#xff0c;也可以运用一些插件&#xff0c;例如 pdf.js、vue-pdf 等等&#xff0c;本文将带大家一…

FastJson、Jackson、Gson、Hutool,JSON解析哪家强?JMH基准测试来排行

首发公众号:【赵侠客】 引言 在前面《释放你九成的带宽和内存&#xff1a;GZIP在解决Redis大Key方面的应用》一文中我使用GZIP算法对JSON格式数据进行了压缩&#xff0c;可以减小88%的空间&#xff0c;文中也提到了目前JSON格式在我们项目中应用的非常广泛几乎无处不在。压缩J…