【2023秋招】每日一题:P1087-美团3-18真题 + 题目思路 + 所有语言带注释

news2024/9/30 3:19:47

2023大厂笔试模拟练习网站(含题解)

www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。
在这里插入图片描述

每日一题:P1087-美团3-18真题
提交链接:https://codefun2000.com/p/P1077

为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"

目录

1.题面

2.思路

3.类似题目推荐

4.代码

题面

在一个荒凉的大漠中,塔子哥被派遣去完成一个秘密任务:消灭在这片区域活动的敌军。这片区域广阔辽阔,有着无尽的沙丘和荒凉的山峰,许多敌人藏匿在这些地方,等待着塔子哥的到来。

为了提高效率,塔子哥使用了一款高级游戏模拟器,在虚拟的游戏环境中,他可以通过控制游戏角色来模拟现实世界中的作战行动。这款游戏的目标是尽可能地抓获敌人。

在游戏中,敌人的位置将被一个二维坐标 ( x , y ) (x,y) (x,y)所描述。塔子哥有一个全屏技能,该技能能一次性将若干敌人一次性捕获。捕获的敌人之间的横坐标的最大差值不能大于 A A A,纵坐标的最大差值不能大于 B B B

现在,塔子哥来到了游戏的一个新关卡,他需要在规定时间内消灭尽可能多的敌人。他打开了游戏地图,看到了所有敌人的坐标。他立刻开始思考,如何才能最大限度地利用自己的技能,一次性捕获尽可能多的敌人。

输入描述

第一行三个整数 N , A , B N,A,B N,A,B,表示共有 N N N个敌人,塔子哥的全屏技能的参数 A A A和参数 B B B

接下来 N N N行,每行两个数字 x , y x,y x,y,描述一个敌人所在的坐标

1 ≤ N ≤ 500 1 \leq N \leq 500 1N500 1 ≤ A , B ≤ 1000 , 1 ≤ x , y ≤ 1000 1 \leq A,B \leq 1000,1 \leq x,y \leq 1000 1A,B10001x,y1000

输出描述

一行,一个整数表示塔子哥使用技能单次所可以捕获的最多数量。

样例 1 1 1

输入

3 1 1
1 1
1 2
1 3

输出

2

说明:
最多可以同时捕获两名敌人,可以是 ( 1 , 1 ) (1,1) (11) ( 1 , 2 ) (1,2) (12)处的敌人,也可以是 ( 1 , 2 ) (1,2) (12) ( 1 , 3 ) (1,3) (13)处的敌人,但不可以同时捕获三名敌人,因为三名敌人时,纵坐标的最大差值是 2 2 2,超过了参数 B B B的值 1 1 1

样例 2 2 2

输入

5 1 2
1 1
2 2
3 3
1 3
1 4

输出

3

说明

最多同时捕获三名敌人。其中一种方案如下: 捕获 ( 1 , 1 ) (1, 1) (11) ( 1 , 3 ) (1,3) (13) ( 2 , 2 ) (2,2) (22)处的三个敌人。

思路

step1:暴力

观察到坐标的范围不大, x x x y y y 都是 1000 1000 1000 以内的。所以直接将每个敌人放入坐标系中再枚举坐标系的每个 a ∗ b a*b ab 的矩形求出矩形内的敌人数量即可。

复杂度 O ( x 4 ) O(x^4) O(x4)

step2:前缀和优化

对于求每个 a ∗ b a * b ab的矩阵的敌人数量时,我们可以使用二维前缀和优化,计算敌人复杂度从 O ( a ∗ b ) O(a*b) O(ab) 降至 O ( 1 ) O(1) O(1)

复杂度: O ( x 2 ) O(x^2) O(x2)

二维前缀和知识点学习:https://oi-wiki.org/basic/prefix-sum/

类似题目推荐

leetcode

  1. 363.最大子矩阵和
  2. 560.和为 K 的子数组
  3. 304.二维区域和检索 - 矩阵不可变
  4. 325.和为 K 的最长子数组长度

Codefun2000

P1195.华为实习-2023.04.19-第一题-塔子哥监考

代码

python

# 读入数据
n, a, b = map(int, input().split())

# 初始化二维矩阵
mp = [[0]*1011 for i in range(1011)]
# 将敌人放入矩阵
for i in range(n):
    x, y = map(int, input().split())
    mp[x][y] += 1       
# 对矩阵求前缀和
for i in range(1, 1011):
    for j in range(1, 1011):
        # 转移方程解释见Oi-Wiki
        mp[i][j] += mp[i-1][j] + mp[i][j-1] - mp[i-1][j-1]
# 枚举技能矩阵(的右下角)
ans = 0
for i in range(a+1, 1011):  #枚举右上端点
    for j in range(b+1, 1011):      #此时枚举的矩形为 (i-a, j-b) 到 (i,j)之间的矩形
        t = mp[i][j] - mp[i-a-1][j] - mp[i][j-b-1] + mp[i-a-1][j-b-1]
        ans = max(ans, t)
print(ans)

C++

#include <bits/stdc++.h>
using namespace std;

int n, a, b;
int mp[1011][1011];

int main() {
    // 读入数据
    cin >> n >> a >> b;
    for(int i = 0; i < n; i++) {
        int x, y;
        cin >> x >> y;
        mp[x][y]++;
    }
    // 对矩阵求前缀和
    for(int i = 1; i <= 1010; i++) {
        for(int j = 1; j <= 1010; j++) {
            mp[i][j] += mp[i-1][j] + mp[i][j-1] - mp[i-1][j-1];
        }
    }
    // 枚举技能矩阵的右下角,并求矩形伤害总和的最大值
    int ans = 0;
    for(int i = a+1; i <= 1010; i++) {
        for(int j = b+1; j <= 1010; j++) {
            int t = mp[i][j] - mp[i-a-1][j] - mp[i][j-b-1] + mp[i-a-1][j-b-1];
            ans = max(ans, t);
        }
    }
    cout << ans << endl;
    return 0;
}

java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int a = sc.nextInt();
        int b = sc.nextInt();
        
        int[][] mp = new int[1011][1011];
        for(int i = 0; i < n; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            mp[x][y]++;
        }

        // 求二维前缀和
        for(int i = 1; i <= 1010; i++) {
            for(int j = 1; j <= 1010; j++) {
                mp[i][j] += mp[i-1][j] + mp[i][j-1] - mp[i-1][j-1];
            }
        }

        // 枚举技能矩阵的右下角,并求矩形伤害总和的最大值
        int ans = 0;
        for(int i = a+1; i <= 1010; i++) {
            for(int j = b+1; j <= 1010; j++) {
                int t = mp[i][j] - mp[i-a-1][j] - mp[i][j-b-1] + mp[i-a-1][j-b-1];
                ans = Math.max(ans, t);
            }
        }

        System.out.println(ans);
    }
}

js

// 监听标准输入流的 data 事件,读取输入的数据并保存到变量 input 中
process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
    return;
});

// 监听标准输入流的 end 事件,在所有数据读入完成后执行核心代码
process.stdin.on('end', () => {
    // 按行分割输入数据,并解析出采用空格分割的三个整数值 n、a 和 b
    const lines = input.trim().split('\n');
    let n, a, b;
    n = parseInt(lines[0].split(' ')[0]);
    a = parseInt(lines[0].split(' ')[1]);
    b = parseInt(lines[0].split(' ')[2]);

    // 创建一个二维数组 mp 用于存储每个点是否被击中
    let mp = [];
    for(let i = 0; i < 1011; i++) {
        mp[i] = new Array(1011).fill(0);
    }

    // 循环读入 n 行数据,并将每个坐标对应的位置标记为已击中
    for(let i = 1; i <= n; i++) {
        let x = parseInt(lines[i].split(' ')[0]);
        let y = parseInt(lines[i].split(' ')[1]);
        mp[x][y]++;
    }

    // 对矩阵求前缀和,通过累加计算矩形内所有击中点的个数
    for(let i = 1; i <= 1010; i++) {
        for(let j = 1; j <= 1010; j++) {
            mp[i][j] += mp[i-1][j] + mp[i][j-1] - mp[i-1][j-1];
        }
    }

    // 枚举技能矩阵的右下角,并求矩形伤害总和的最大值
    let ans = 0;
    for(let i = a+1; i <= 1010; i++) {
        for(let j = b+1; j <= 1010; j++) {
            let t = mp[i][j] - mp[i-a-1][j] - mp[i][j-b-1] + mp[i-a-1][j-b-1];
            ans = Math.max(ans, t);
        }
    }

    // 输出结果
    console.log(ans);
});

go

package main

import (
	"fmt"
)

func main() {

	var n, a, b, x, y int
	fmt.Scan(&n, &a, &b)
	N := 1005
	x_y := make([][]int, N)
	for i := 0; i < N; i++ {
		x_y[i] = make([]int, N)
	}
	for i := 0; i < n; i++ {
		fmt.Scan(&x, &y)
		x_y[x][y] = x_y[x][y] + 1
	}

	//计算前缀和.
	for i := 1; i < N; i++ {
		for j := 1; j < N; j++ {
			x_y[i][j] = x_y[i][j-1] + x_y[i-1][j] - x_y[i-1][j-1] + x_y[i][j]
		}
	}
	//计算小矩阵.
	max_v := 0
	for i := a + 1; i < N; i++ {
		for j := b + 1; j < N; j++ {
			t := x_y[i][j] - x_y[i-a-1][j] - x_y[i][j-b-1] + x_y[i-a-1][j-b-1]
			max_v = max(max_v, t)
		}
	}
	fmt.Println(max_v)
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

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

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

相关文章

【C生万物】 指针和数组笔试题汇总 (下)

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《C生万物 | 先来学C》&#x1f448; 前言&#xff1a; 承接上文&#xff0c;继续进行指针和数组的练习。 目录 Part2:指针笔试题 1.做题 …

硬件系统工程师宝典(24)-----如何能够正确理解三极管?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到不同材质的磁珠&#xff0c;频率阻抗特性不同&#xff0c;根据磁珠的频率阻抗特性曲线&#xff0c;磁珠在低频时电感起作用&#xff0c;…

Java开源工具库使用之压测JMeter

文章目录 前言一、概念原理1.1 Jmeter 原理1.2 性能测试术语1.3 web项目性能标准 二、常用元件2.1 线程组2.2 取样器2.3 控制器2.4 定时器2.5 前置/后置处理器2.6 配置元件2.7 监听器 三、插件3.1 第三方插件3.2 录制插件 四、JSR223 脚本及函数4.1 JSR223 脚本4.2 函数变量 五…

职场难题:克服压力、提升自我能力,勇闯职场巅峰

在当今激烈的职场竞争中&#xff0c;职场难题时常出现&#xff0c;如何进行有效沟通、如何应对工作压力、如何提升职业能力等&#xff0c;这些问题都是需要克服的问题。作为一名在职场中求生存&#xff0c;求发展的职业人士&#xff0c;我们必须学会适应这些挑战&#xff0c;掌…

Java基础面试题突击系列1

&#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我不迷路 ❤️《java面试核心知识》突击系列&#xff0c;持续更新… &#x1f490; 面试必知必会学习路线&#xff1a;Java技术栈面试系列SpringCloud项目实战学习路线 &#x1f4dd;再小的收获x365天…

面了个 Java 实习生,小伙很优秀!

大家好&#xff0c;我是鱼皮&#xff0c;前几天给自己的公司面试了一位 Java 暑期实习生&#xff0c;候选人目前是大三。 整个过程我都录屏了&#xff0c;并且在征得候选人的同意后&#xff0c;把面试过程分享出来。一方面是希望对其他在学编程找工作的小伙伴有一些启发和参考…

强化学习代码规划之深度学习预备

现在到了自动编码器和解码器&#xff0c;同样&#xff0c;先练几遍代码&#xff0c;再去理解 import torch import torch.nn as nn import torch.utils.data as Data import torchvision import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matpl…

文心一言和ChatGPT最全对比

文心一言和ChatGPT都是基于深度学习技术的自然语言处理模型&#xff0c;有各自的优势和使用场景&#xff0c;无法简单地比较 ChatGPT 和文心一言哪一个功能更强大&#xff0c;它们各自具有优势和局限性&#xff0c;需要根据具体需求进行选择&#xff0c;以下一些具体对比&#…

HttpRunner 接口自动化测试进阶

这里我们介绍一下通过调试源码的方式来做接口测试&#xff1a; 1、获取源码 github下载或pycharm的git checkout功能去获取&#xff0c;这里直接下载 通过ide打开解压后的源码包 源码包含三层目录结构&#xff1a;docs帮助文档、httprunner核心库、tests自测文件 2、源码结…

小白量化《穿云箭集群量化》(8) 实盘核聚变氢弹策略

小白量化《穿云箭集群量化》&#xff08;8&#xff09; 核聚变策略 上一篇介绍了超级订单SuperOrder功能在股票上买入策略&#xff0c;这篇介绍MetaTrader5期货外汇的双向交易策略。 交易策略比较有名的是马丁策略&#xff0c;马丁策略是单向策略。 我们设计了双向策略原子弹策…

新来的实习生太牛了,还是我们太弱了?...

前几天有个朋友向我哭诉&#xff0c;说她在公司工作&#xff08;软件测试&#xff09;了7年了&#xff0c;却被一个实习生代替了&#xff0c;该何去何从&#xff1f; 这是一个值得深思的问题&#xff0c;作为职场人员&#xff0c;我们确实该思考&#xff0c;我们的工作会被实习…

Qt布局管理器

一、布局管理器 1.1、布局管理器的作用 布局管理器是摆放控件的辅助工具&#xff0c;主要解决组件的位置和大小无法自适应父窗口变化的问题&#xff0c;主要功能如下&#xff1a; 自动调整控件的位置&#xff0c;包括控件之间的间距、对齐等当用户调整窗口大小时&#xff0c;位…

【洛谷】P1404 平均数

【洛谷】P1404 平均数 题目描述 给一个长度为 n n n 的数列&#xff0c;我们需要找出该数列的一个子串&#xff0c;使得子串平均数最大化&#xff0c;并且子串长度 ≥ m \ge m ≥m。 输入格式 第一行两个整数 n n n 和 m m m。 接下来 n n n 行&#xff0c;每行一个整数 …

激光点云3D目标检测算法之CenterPoint

激光点云3D目标检测算法之CenterPoint 本文首发于公众号【DeepDriving】&#xff0c;欢迎关注。 前言 CenterPoint是CVPR 2021的论文《Center-based 3D Object Detection and Tracking》中提出的一个激光点云3D目标检测与跟踪算法框架&#xff0c;与以往算法不同的是&#xff…

一大波特斯拉人形机器人上线,马斯克震撼官宣2款新车!

来源 | 新智源 ID | AI-era 【导读】这次特斯拉股东日&#xff0c;虽没有新车&#xff0c;但马斯克确定Cybertruck今年一定会来。 特斯拉股东日&#xff0c;依旧没有新车。 万众瞩目的马斯克登台继续画饼&#xff0c;「我不官宣新车&#xff0c;不过新车年销量会超过500万」…

【云原生】k8sPod基础概念

k8sPod基础概念 一、Pod概述1、pod概念2、Pod资源限制 二、Pod的两种使用方式三、资源共享1、创建Pod的方式2、Pod功能 四、底层容器Pause1、Pause共享资源2、Pause主要功能3、Pod与Pause结构设计用意 五、镜像的拉取策略1、Pod容器镜像拉取策略2、Pod重启策略 六、容器的分类1…

信息收集-ip地址

1、cdn网络 CDN&#xff08;Content Delivery Network&#xff09;网络是一种分布式网络架构。它通过将内容&#xff08;如网页、图片、视频等&#xff09;缓存到公共的服务器上&#xff0c;以便更快速、更可靠地交付给用户所在的位置。CDN解决了Internet中的一些固有瓶颈和性…

【ROS】Ubuntu22.04安装ROS2(Humble Hawksbill)

0、版本说明 Ubuntu22.04对应的ROS2的版本为Humble Hawksbill&#xff08;ros-humble&#xff09; 如果不是在Ubuntu22.04中安装ROS&#xff0c;请参考下面Ubuntu和ROS的版本对应关系 1、更新apt包列表 $ sudo apt update2、设置编码 将ubuntu环境语言编码设置为en_US en_…

appium自动化测试实战详解及框架搭建

目录 一、Appium的介绍 二、Appium实战&#xff08;以真机为例&#xff09; 一、Appium的介绍 Appium是一款开源的自动化测试工具&#xff0c;其支持iOS和安卓平台上的原生的&#xff0c;基于移动浏览器的&#xff0c;混合的应用。 1、 使用appium进行自动化测试的好…

【C++】容器篇(一)—— vector 的基本概述以及模拟实现

前言&#xff1a; 在之前&#xff0c;我们已经对 string类进行了基本的概述&#xff0c;并且手动的实现了string类中常用的接口函数。本期&#xff0c;我将带领大家学习的是STL库中的一个容器 -- vector 的学习。相比于之前的string类&#xff0c;本期的 vector 相对来说实现起…