【备战秋招】每日一题:5月13日美团春招第四题:题面+题目思路 + C++/python/js/Go/java带注释

news2024/11/17 23:51:28

为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第四题-沙堡

在线评测链接:P1289

题目描述

塔子哥在海边建了一个沙堡乐园。

里面有一个巨大的沙堡,塔子哥每年都会增加这个沙堡的层数,但也有一定的规律:

1、沙堡底层序号为 1 ;

2、沙堡的任何一个部分每年最多只能增加一个小沙堡(也可能不增加) ;

3、新建的小沙堡一定是独立的,没有和其他小沙堡连接(除了父亲沙堡);

现在塔子哥准备了今年沙堡的示意图和明年沙堡的设计图,他想让你告诉他,第一座沙堡明年能否变成第二座沙堡。

输入描述

输入第一行为 T ,表示 T 组数据。( 1≤T≤10 )

对于每一组数据,包含4行:

第一行是第一座沙堡的个数:n ,第二行有 n-1 个数字l_i(i=2,3,...,n) 表示第 i 个沙堡的是建在第 l_i(i=2,3,...,n) 个沙堡上的。

第三行是第二座沙堡的个数:m ,第四行有 m-1 个数字 r_i(i=2,3,...,n) 表示第 i 个沙堡是建在第 r_i(i=2,3,...,n)个沙堡上的。

(1\leq n,m\leq 50000,1\leq l_i,r_i\leq i)

输入保证两座沙堡的对应序号相同,即两座沙堡的共有点的父节点相同,且第二座包括第一座的所有节点。

输出描述

如果第一座明年有可能建成第二座,输出“yes”,否则输出”no”.

样例

输入

1
5
1 1 1 4
8
1 1 1 4 5 1 4

输出

yes

思路

模拟 + 排序

题目保证两座沙堡的对应序号相同。故前 n 个沙堡无需考虑是否相同的问题。

从明天的第 n + 1 个沙堡开始,为新增的沙堡,这块的沙堡要满足,所有沙堡的父亲沙堡编号都各不相同,所以沙堡的父亲编号都小于等于 n ,因为大于 n 的编号均为明天新增的小沙堡,其不可能作为其他沙堡的父亲沙堡。

为了方便判断是否有两个新增沙堡的父亲沙堡相同,将所有的新增沙堡按其父亲沙堡编号排序,如果两个沙堡的父亲沙堡编号相同,这两个沙堡在排序后必然相邻。

时间复杂度:O(n\log n) 排序的复杂度,因为合法的 m 最多是 2n

类似题目推荐

推荐几道排序相关的题目

LeetCode

1.合并两个有序数组

2.最大间距

Codefun2000

  1. P1048. 华东师范大学保研机试-2022-整数排序

  2. P1281 中国光大银行 2023.05.13-春招-第一题-泡泡排序

  3. P1173 京东 2023.04.08-春招-第三题-构造排列

  4. P1014 美团 2022.10.8-塔子玩游戏

代码

CPP

#include <bits/stdc++.h>
using namespace std;
​
void solve() {
    int n;
    cin >> n;
    vector<int> A;
    // 今天的沙堡
    for (int i = 1; i < n; ++i) {
        int j; cin >> j;
        j -= 1;
        A.emplace_back(j);
    }
​
    int m;
    cin >> m;
    vector<int> B;
    // 明天的沙堡
    for (int i = 1; i < m; ++i) {
        int j; cin >> j;
        j -= 1;
        B.emplace_back(j);
    }
​
    // 今天的沙堡数量必然小于等于明天的沙堡数量
    if (n > m) {
        cout << "no\n";
        return;
    }
​
    // 新增的沙堡的父亲沙堡编号全都是 < n 的,且新增的沙堡的父亲沙堡编号不能相同(每天一个沙堡只能新增一个小沙堡)
    // 将新增的沙堡的父亲编号排序,那么相同的父亲沙堡编号必然相邻
    sort(B.begin() + n - 1, B.end());
    for (int i = n - 1; i < B.size(); ++i) {
        if (B[i] >= n) {
            cout << "no\n";
            return;
        }
        if (i >= n && B[i] == B[i - 1]) {
            cout << "no\n";
            return;
        }
    }
​
    cout << "yes\n";
}
​
int main()
{
    int T = 1;
    cin >> T;
    while (T--) solve();
​
    return 0;
}

python

def solve():
    n = int(input())
    A = list(map(int, input().split()))
    # 今天的沙堡
    for i in range(n - 1):
        A[i] -= 1
​
    m = int(input())
    B = list(map(int, input().split()))
    # 明天的沙堡
    for i in range(m - 1):
        B[i] -= 1
​
    # 今天的沙堡数量必然小于等于明天的沙堡数量
    if n > m:
        print("no")
        return
​
    # 新增的沙堡的父亲沙堡编号全都是 < n 的,且新增的沙堡的父亲沙堡编号不能相同(每天一个沙堡只能新增一个小沙堡)
    # 将新增的沙堡的父亲编号排序,那么相同的父亲沙堡编号必然相邻
    B[n - 1:] = sorted(B[n - 1:])
    for i in range(n - 1, len(B)):
        if B[i] >= n:
            print("no")
            return
        if i >= n and B[i] == B[i - 1]:
            print("no")
            return
​
    print("yes")
​
​
T = int(input())
for _ in range(T):
    solve()
​

Java

import java.util.*;
​
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while (T-- > 0) {
            solve(sc);
        }
    }
​
    public static void solve(Scanner sc) {
        int n = sc.nextInt();
        List<Integer> A = new ArrayList<>();
        // 今天的沙堡
        for (int i = 1; i < n; ++i) {
            int j = sc.nextInt() - 1;
            A.add(j);
        }
​
        int m = sc.nextInt();
        List<Integer> B = new ArrayList<>();
        // 明天的沙堡
        for (int i = 1; i < m; ++i) {
            int j = sc.nextInt() - 1;
            B.add(j);
        }
​
        // 今天的沙堡数量必然小于等于明天的沙堡数量
        if (n > m) {
            System.out.println("no");
            return;
        }
​
        // 新增的沙堡的父亲沙堡编号全都是 < n 的,
        // 且新增的沙堡的父亲沙堡编号不能相同(每天一个沙堡只能新增一个小沙堡)
        // 将新增的沙堡的父亲编号排序,那么相同的父亲沙堡编号必然相邻
        Collections.sort(B.subList(n - 1, B.size()));
        for (int i = n - 1; i < B.size(); ++i) {
            if (B.get(i) >= n) {
                System.out.println("no");
                return;
            }
            if (i >= n && B.get(i).equals(B.get(i - 1))) {
                System.out.println("no");
                return;
            }
        }
​
        System.out.println("yes");
    }
}

Go

package main
​
import (
    "bufio"
    "fmt"
    "os"
    "sort"
    "strconv"
)
​
func solve(scanner *bufio.Scanner) {
    n := nextInt(scanner)
    A := make([]int, n-1)
    // 今天的沙堡
    for i := 0; i < n-1; i++ {
        A[i] = nextInt(scanner) - 1
    }
​
    m := nextInt(scanner)
    B := make([]int, m-1)
    // 明天的沙堡
    for i := 0; i < m-1; i++ {
        B[i] = nextInt(scanner) - 1
    }
​
    // 今天的沙堡数量必然小于等于明天的沙堡数量
    if n > m {
        fmt.Println("no")
        return
    }
​
    // 新增的沙堡的父亲沙堡编号全都是 < n 的,
    // 且新增的沙堡的父亲沙堡编号不能相同(每天一个沙堡只能新增一个小沙堡)
    // 将新增的沙堡的父亲编号排序,那么相同的父亲沙堡编号必然相邻
    sort.Ints(B[n-1:])
    for i := n - 1; i < len(B); i++ {
        if B[i] >= n {
            fmt.Println("no")
            return
        }
        if i >= n && B[i] == B[i-1] {
            fmt.Println("no")
            return
        }
    }
​
    fmt.Println("yes")
}
​
func nextInt(scanner *bufio.Scanner) int {
    scanner.Scan()
    n, _ := strconv.Atoi(scanner.Text())
    return n
}
​
func main() {
    scanner := bufio.NewScanner(os.Stdin)
    scanner.Split(bufio.ScanWords)
​
    T := nextInt(scanner)
    for i := 0; i < T; i++ {
        solve(scanner)
    }
}

Js

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
    return;
});
process.stdin.on('end', () => {
    const lines = input.trim().split('\n');
    let T = parseInt(lines[0]);
    let index = 1;
    while (T--) {
        let n = parseInt(lines[index++]);
        let A = lines[index++].split(' ').map(x => parseInt(x));
        // 今天的沙堡
        for (let i = 0; i < n-1; ++i) {
            A[i] -= 1;
        }
​
        let m = parseInt(lines[index++]);
        let B = lines[index++].split(' ').map(x => parseInt(x));
        // 明天的沙堡
        for (let i = 0; i < m-1; ++i) {
            B[i] -= 1;
        }
​
        // 今天的沙堡数量必然小于等于明天的沙堡数量
        if (n > m) {
            console.log("no");
            continue;
        }
​
        let is_no = false; 
​
        // 新增的沙堡的父亲沙堡编号全都是 < n 的,
        // 且新增的沙堡的父亲沙堡编号不能相同(每天一个沙堡只能新增一个小沙堡)
        // 将新增的沙堡的父亲编号排序,那么相同的父亲沙堡编号必然相邻
        B.slice(n - 1).sort((a, b) => a - b);
        for (let i = n - 1; i < B.length; ++i) {
            if (B[i] >= n) {
                console.log("no");
                is_no = true;
                break;
            }
            if (i >= n && B[i] === B[i - 1]) {
                console.log("no");
                is_no = true;
                break;
            }
        }
        if (!is_no) console.log("yes");
    }
});

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

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

相关文章

Found a swap file by the name “.credentials.swp“

问题 使用vim终端编辑一个文件的时候&#xff0c;遇到了一个提示&#xff1a;Found a swap file by the name ".credentials.swp" 解决 这是由于编辑文件意外退出导致的&#xff0c;产生了.swp文件,这个时候&#xff0c;只要按下键盘【A】键 然后&#xff0c;使用…

Easy_Trans轻松让你的项目减少30%SQL代码量

什么是Easy_Trans Easy Trans是一款用于做数据翻译的代码辅助插件&#xff0c;利用MyBatis Plus/JPA/BeetlSQL 等ORM框架的能力自动查表&#xff0c;让开发者可以快速的把ID/字典码 翻译为前端需要展示的数据。 easy trans的优点 功能多样 缓存支持 跨微服务翻译支持(User和…

蓝奥声核心技术分享 ——无线单火控制技术

1.技术背景 无线单火控制技术指基于对目标场景状态变化的协同感知而获得触发响应并进行智能决策&#xff0c;属于蓝奥声核心技术--边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术属于物联网边缘域的无线通信与智能控制技术领域。 对于不同智能应用场景&am…

安庆师范大学之计科-数据结构MOOC期末考试

单选 5分/题&#xff0c;共30题 1、在长度为n的顺序表的第i个位置上插入一个元素&#xff0c;i的合理取值范围是&#xff08; &#xff09;。 A.1≤i≤n B.任意正整数 C.i≥0 D.1≤i≤n1 正确答案&#xff1a;D 2‏、已知L是带表头结点单链表的头指针&#xff0c;摘除…

kubernetes operator解析

您是否想过站点可靠性工程 (SRE) 团队如何有效地成功管理复杂的应用程序&#xff1f; 在 Kubernetes 生态中&#xff0c;只有一个答案&#xff1a;Kubernetes Operators&#xff01; 在本文中&#xff0c;我们将研究它们是什么以及它们是如何工作的。 Kubernetes Operator 概念…

STM32 软件模拟SPI

STM32 软件模拟SPI 前言关于 SPISPI 协议软件模拟实现Driver_SPI.hDriver_SPI.c 前言 STM32库&#xff1a;标准函数库 测试环境&#xff1a;STM32F103系列 关于 SPI SPI 协议 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外设接口&#xff09;是由摩托罗拉…

Python ChatGPT API 新增的函数调用功能演示

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 OpenAI 重磅更新&#xff0c;API 添加函数调用能力&#xff0c;能处理更长上下文&#xff0c;价格又有所降低 … 知乎讨论&#xff1a;https://www.zh…

【超详细教学】Python制作迷宫小游戏教程

文章目录 前言1.首先确定迷宫的大小2. 定义迷宫的墙壁和通道3.定义迷宫的起点和终点4.定义迷宫的方向5. 生成一个空的迷宫6. 在迷宫中随机选择一个起点和终点7. 在迷宫中随机选择一个方向8. 检查一个位置是否在迷宫内9. 检查一个位置是否是墙壁10. 检查一个位置是否是通道11. 检…

工程师卓越之旅:技术文档怎么写

0.意义和价值 当前信息共享长期技术知识传承加深作者的理解和思考交付包括代码和技术文档 1.准备阶段 明确文档需求、受众和内容范围 2.调研阶段 对比有代表性的同类或相似的技术文档&#xff0c;建立大致框架收集相关信息&#xff0c;分析验证进行技术决策在文档中将每个…

HttpServletRequest对象中获取客户端IP地址

什么是HttpServletRequest对象 HttpServletRequest对象是Java Servlet规范中定义的一种接口&#xff0c;它封装了客户端请求的所有信息&#xff0c;例如请求头、请求参数、请求方法、请求URL等。在Java Web开发中&#xff0c;HttpServletRequest对象非常常用&#xff0c;可以用…

关于Java SSM框架的面试题

一、Spring面试题 1、Spring 在ssm中起什么作用&#xff1f; Spring&#xff1a;轻量级框架作用&#xff1a;Bean工厂&#xff0c;用来管理Bean的生命周期和框架集成。两大核心&#xff1a;1、IOC/DI(控制反转/依赖注入) &#xff1a;把dao依赖注入到service层&#xff0c;se…

程序替换原理

文章目录 一、程序替换 一、程序替换 程序替换用于将当前进程的用户空间的代码和数据全部替换为新程序的代码和数据&#xff0c;程序替换不会创建新进程&#xff0c;而是用当前进程执行新程序的代码&#xff0c;fork 创建子进程后&#xff0c;子进程默认执行的是父进程的代码&…

信创-大数据平台CPU架构支持

一、CDH和HDP、CDP CDP数据中心类似于CDH和HDP,直接安装在硬件服务器上,目前支持市面上主流的X86服务器,包括国内海光服务器&#xff0c; CDH不支持ARM 以上两种大数据平台都仅支持x86架构&#xff0c;早在几年期RedHat联手cloudera公司发表声明将推出64位ARM版&#xff0c;据…

【备战秋招】每日一题:4月29日美团春招第一题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第一题-选修课 在线评测链接:P1266 题目内容 某大学一共有 n 门课程&#xff0c;编号为 1 ~ n &#xff0c; m 个学院&#xff0c;编号为1 ~ m 。最近开学季&#xff0c;…

剑指 Offer 53 - II: 0~n-1中缺失的数字

看到这道题的第一反应就是二分查找&#xff0c;由于是递增的所以二分查找所需的时间很短 &#xff0c;设置一个左&#xff0c;一个右&#xff0c;一个中间&#xff0c;如果判断吧不同需要想下前面是否一样&#xff0c;如果是那么就找到&#xff0c;不是再继续二分查找。 我的思…

【redis】redis的5种数据结构及其底层实现原理

文章目录 redis中的数据结构redis数据结构底层实现stringlisthashsetintset字典 zset跳表插入删除过程 redis中的数据结构 Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;…

小波变换之pycwt (python)

小波变换之pycwt PyCWT是用于连续小波谱分析的Python模块&#xff0c;它包括小波变换和FFT算法统计分析的常规操作的集合。此外&#xff0c;该模块还包括交叉小波变换、小波相干性测试和样例脚本。 该模块需要NumPy和SciPy&#xff0c;matplotlib模块。 pip安装&#xff1a;…

SSMP整合案例(1) 构建 Spring Boot Vue MySql项目环境

前面 我们通过 java springboot整合MyBatis做数据库查询操作 java springboot整合MyBatis-Plus 多用点Plus支持一下国人开发的东西吧 java springboot整合Druid数据源配置 大体熟悉了springboot正好第三方应用的操作 那么 我们就来写一个 基于springboot的SSMP整合案例 其实就…

MongoDB快速实战与基本原理-1

一、MongoDB介绍 1、什么是MongoDB MongoDB是 一个文档数据库&#xff08;以 JSON 为数据模型&#xff09; &#xff0c;由C语言编写&#xff0c;旨在 为 WEB应用提供可扩展的高性能数据存储解决方案。 文档来自于“ JSON Document”&#xff0c;并非我们一般理解的 PDF&am…

人机交互学习-8 交互设计模型与理论

交互设计模型与理论 预测模型GOMS模型GOMS全称GoalsOperatorsMethodsSelection Rules 举例GOMS方法步骤GOMS模型分析 击键层次模型操作符使用方法放置M操作符的启发规则KLM分析KLM应用 Fitts定律三个指标a,b的确定说明Fitts定律建议Fitts定律应用 动态特性建模状态转移网三态模…