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

news2024/9/21 22:31:18

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

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

https://codefun2000.com/p/P1140

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

题目内容

塔子哥是一个年轻的魔法学徒,他一直在努力学习各种魔法技能。他听说倒水魔法是一种非常强大的魔法,但也是一种非常难掌握的魔法。他早早地来到了魔法训练室,希望能够掌握这种魔法。

魔法训练室里有 n n n 个神奇的杯子,有着不同的大,假设第 i i i 个杯子已满,向其倒水,多余的水会正正好好流向第 i + 1 i+1 i+1 个杯子(如果 i = n i=n i=n 时没有下一个杯子,不会有杯子接住此时多余的水而溢出到魔法训练室的水池)。

这些杯子有着初始固定的水量,每次练习后杯子里的水都会还原到最初状态。每次练习时,魔法黑板会告诉塔子哥需要将哪一人杯子倒满水。因为每个杯子的材质和形状有所不同所以对其释放倒水魔法需要消耗的魔法值不同。塔子哥想尽可能多练习,所以需要最小化每次消耗的魔法值的总量。

输入描述

第一行一个整数 n n n ,表示杯了数量。

第二行 n n n 个整数 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn ,依次表示第 i i i 个杯子能容纳水的量(单位为毫升)。

第三行 n n n 个整数 y 1 , y 2 , . . . , y n y_1,y_2,...,y_n y1,y2,...,yn ,依次表示第 i i i 个杯子初始有的水量(单位为毫升)。

第四行 n n n 个整数 z 1 , z 2 , . . . , z n z_1,z_2,...,z_n z1,z2,...,zn ,依次表示对第 i i i 个杯子每添加1毫升水需要消耗的法力值。

第五行一个整数 m m m ,表示练习的数量。

第六行 m m m 个整数 q 1 , q 2 , … , q n q_1,q_2,…,q_n q1,q2,,qn ,依次表示第 i i i 次练习时需要将第 q i q_i qi 个杯子倒满。(每次练习过后,杯子里的水量都会还原为初始状态,不会影响到下一次练习)

1 ≤ n , m ≤ 3000 , 1 ≤ y i ≤ x x ≤ 1 0 9 , 1 ≤ z i ≤ 300 , 1 ≤ q i ≤ n 1\le n,m\le 3000,1\le y_i\le x_x \le 10^9,1\le z_i \le 300,1\le q_i\le n 1n,m30001yixx1091zi3001qin

输出描述

输出第一行 m m m 个数,依次表示每次训练时需要消耗的最小法力值。

如果杯子初始本身就是满的,则需要消耗的法力值为 0 0 0

样例

输入

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

输出

2 0

样例解释
第一次训练,最优方案如下:

初始时杯子的水量和最大容量分别为

1/1 1/2 2/3

  1. 给1号杯子(本身已满)倒水1毫升,消耗1点法力,水溢出转移到2号杯子,当前状态为1/1 2/2 2/3
  2. 2.继续给1号杯子(本身已满)倒水1毫升,消耗1点法力,水溢出到2号杯子(也已满),继续溢出到3号杯子,此时3号杯子也被成功注满水,状态为:
    1/1 2/2 3/3

共消耗2点法力。可以证明没有更优方案。

第二次训练时,

初始时杯子的水量和最大容量分别为(注意不同训练互不影响,因为训练结束后魔法会让水杯还原为初始状态)

1/1 1/2 2/3

可以发现1号杯子已满,不用注水,消耗法力为0。

思路:贪心+前缀和

对于第 q i q_i qi 次询问,目标是将第 j j j 个杯子装满,那么选择从第 k ( k ≤ j ) k (k\leq j) k(kj) 个杯子开始倒水,那么 [ k , j ] [k, j] [k,j] 这些杯子被装满的水均来自第 k k k 个杯子溢出的。

选择从第 k ( k ≤ j ) k (k\leq j) k(kj) 个杯子开始倒水,则需要使得 [ k + 1 , j ] [k+1,j] [k+1,j] 这些杯子都倒满,魔力值为 z k × ∑ i = k j ( x i − y i ) z_k\times \sum\limits_{i=k}^j (x_i-y_i) zk×i=kj(xiyi)。答案即
min ⁡ t = 1 j ( z k × ∑ i = k j ( x i − y i ) ) \min\limits_{t=1}^j(z_k\times \sum\limits_{i=k}^j (x_i-y_i)) t=1minj(zk×i=kj(xiyi))
此外,代码中使用了一个 trick,就是对于每个查询,从 j j j 1 1 1 来枚举从每个杯子开始倒水(而不是从 1 1 1 j j j),这样我们就可以维护这其中需要添加的水量。因为如果是从 1 1 1 j j j 来枚举,则对于每次的倒水量都需要 O ( n ) O(n) O(n) 去查询,导致总复杂度是 O ( n 3 ) O(n^3) O(n3) , 当然也可以直接使用前缀和来维护。

时间复杂度: O ( n 2 ) O(n^2) O(n2)

最优结构

选择从第 k k k 个杯子装满水,必然有 z k < min ⁡ ( z k + 1 z k + 2 , ⋯   , z j ) z_k < \min{(z_{k+1}z_{k+2},\cdots,z_j)} zk<min(zk+1zk+2,,zj)

否则选择一个 i n d e x ∈ [ k + 1 , j ] index\in [k+1,j] index[k+1,j],有 z i n d e x ≤ z k z_{index}\leq z_k zindexzk,同时有 ∑ i = i n d e x j ( x i − y i ) ≤ ∑ i = k j ( y i − x i ) \sum_{i=index}^j(x_i-y_i)\leq \sum_{i=k}^j(y_i-x_i) i=indexj(xiyi)i=kj(yixi),从第 k k k 个杯子开始倒水花费的魔力值必然不会小于从第 i n d e x index index 个杯子倒水花费的魔力值。

类似知识点题目推荐

这道题的特点是枚举得到最优解 , 可以考虑以下几个题

leetcode

1.剑指 Offer II 013. 二维子矩阵的和 --前缀和开胃菜

2.剑指 Offer II 040. 矩阵中最大的矩形

CodeFun2000

1.P1175 华为od 2023.04.08–第二题-新学校选址

2.P1214 民生科技 2023.04.22-技术研发春招-第一题-删点

3.P1188 2023.04.12-微众银行春招-第三题-魔法收纳器 --难度较高!

代码

C++

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

const int N = 3010;
int x[N], y[N], z[N];
int n, m;

int main()
{
    // 读入
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d", &x[i]);
    for (int i = 1; i <= n; ++i) scanf("%d", &y[i]);
    for (int i = 1; i <= n; ++i) scanf("%d", &z[i]);
    scanf("%d", &m);
    // 处理每个询问
    for (int i = 1; i <= m; ++i) {
        int p; scanf("%d", &p);
        // 根据思路给出的公式计算
        long long ans = 1e18;
        long long sum = 0;
        for (int j = p; j >= 1; --j) {
            sum += (x[j] - y[j]);
            ans = min(ans, sum * z[j]);
        }
        printf("%lld%c", ans, " \n"[i == m]);
    }
    
    return 0;
}

python

# 读入
n = int(input())
x = list(map(int, input().split()))
y = list(map(int, input().split()))
z = list(map(int, input().split()))
m = int(input())
q = list(map(int, input().split(" ")))
# 根据思路给出的公式计算即可
for i in range(m):
    ans = 10**18
    s = 0
    for j in range(q[i]-1, -1, -1):
        s += (x[j] - y[j])
        ans = min(ans, s * z[j])
    print(ans, end="\n" if i == m - 1 else " ")

Java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
		// 读入
        int n = scanner.nextInt();
        int[] x = new int[n+1];
        int[] y = new int[n+1];
        int[] z = new int[n+1];

        for (int i = 1; i <= n; ++i) x[i] = scanner.nextInt();
        for (int i = 1; i <= n; ++i) y[i] = scanner.nextInt();
        for (int i = 1; i <= n; ++i) z[i] = scanner.nextInt();	
	    // 处理每个询问
        int m = scanner.nextInt();
        for (int i = 0; i < m; ++i) {
            int p = scanner.nextInt();
            long ans = (long)1e18;
            long sum = 0;
            // 根据思路给出的公式计算
            for (int j = p; j >= 1; --j) {
                sum += (x[j] - y[j]);
                ans = Math.min(ans, sum * z[j]);
            }
            System.out.print(ans + (i == m-1 ? "\n" : " "));
        }
    }
}

Go

package main
import (
	"fmt"
)
func main() {
	var n, m int
    // 读入
	fmt.Scan(&n)
	x := make([]int, n)
	y := make([]int, n)
	z := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&x[i])
	}
	for i := 0; i < n; i++ {
		fmt.Scan(&y[i])
		x[i] -= y[i]
	}
	for i := 0; i < n; i++ {
		fmt.Scan(&z[i])
	}
	fmt.Scan(&m)
	q := make([]int, m)
	for i := 0; i < m; i++ {
		fmt.Scan(&q[i])
		q[i]--
	}
	// 处理每一个询问
	for i := 0; i < m; i++ {
		var ans int = 1e18
		var s int
        // 倒序处理
		for j := q[i]; j >= 0; j-- {
			s += x[j]
			if ans > s*z[j] {
				ans = s * z[j]
			}
		}
		fmt.Printf("%d", ans)
		if i == m-1 {
			fmt.Println("")
		} else {
			fmt.Print(" ")
		}
	}
}

Js

process.stdin.resume();
process.stdin.setEncoding("utf-8");
let input = "";

process.stdin.on("data", (data) => {
  input += data;
});
process.stdin.on("end", () => {
    // 读入
 	const lines = input.trim().split("\n");
	const n = parseInt(lines[0]);
  	const x = lines[1].trim().split(" ").map((num) => parseInt(num));
  	const y = lines[2].trim().split(" ").map((num) => parseInt(num));
  	const z = lines[3].trim().split(" ").map((num) => parseInt(num));
  	const m = parseInt(lines[4]);
  	const q = lines[5].trim().split(" ").map((num) => parseInt(num));
    // 处理每个询问
  	for (let i = 0; i < m; i++) {
    	let ans = 10 ** 18;
    	let s = 0;
        // 根据题目公式来做
    	for (let j = q[i] - 1; j >= 0; j--) {
      		s += x[j] - y[j];
      		ans = Math.min(ans, s * z[j]);
    	}
   		process.stdout.write(ans + (i === m - 1 ? "\n" : " "));
  }
});

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

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

相关文章

电商 - 高并发下订单商品库存扣减方案

开发一个电商库存系统时,我们最担心的就是高并发和防超卖了 电商库存系统场景 前提:分布式系统,高并发 商品A只有100库存,现在有1000或者更多的用户购买。如何保证商品库存在高并发的场景下是安全的 高并发场景下,商品展示页上面的信息,除了库存的其他信息属于静态数据…

ClickHouse性能调优——压缩和编码算法

随着数据库数据越来越多&#xff0c;给数据存储、网络访问造成成本和负担。压缩技术节约存储空间、加速网络访问的常用解决方案&#xff0c;本文主要介绍压缩算法和ClickHouse编码技术。 压缩类型 ClickHouse协议支持LZ4和ZSTD 压缩算法&#xff0c;两者都是基于字典使用校验和…

【Linux】信号(一文学会,八千字好文深度讲解信号)

目录 1.信号的初步理解 2.信号处理 信号的产生 信号的保存 前台进程和后台进程 信号处理以及产生信号 对于信号的处理方式有三种 产生信号&#xff1a; 1.通过终端按键产生信号 2.调用系统函数向进程发信号​编辑 ​编辑 3. 由软件条件产生信号 4.硬件异常产生信…

docker私有仓库harbor部署

1. harbor简介&#xff1a; Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;通过添加一些企业必需的功能特性&#xff0c;例如安全、标识和管理等&#xff0c;扩展了开源Docker Distribution。作为一个企业级私有Registry服务器&#xff0c;Harbor提…

系列二、MongoDB的安装

一、传统方式安装 1.1、下载安装包 https://www.mongodb.com/try/download/community-kubernetes-operator 1.2、上传至opt目录并解压 tzr -xzvf mongodb-linux-x86_64-rhel70-5.0.18.tgz 1.3、移动mongodb安装包并重命名 mv mongodb-linux-x86_64-rhel70-5.0.18 /usr/local…

【Unity100个实用小技巧】屏幕后处理实现渐隐渐现

☀️博客主页&#xff1a;CSDN博客主页&#x1f4a8;本文由 我是小狼君 原创&#xff0c;首发于 CSDN&#x1f4a2;&#x1f525;学习专栏推荐&#xff1a;面试汇总❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&#xf…

35 KVM管理设备-管理虚拟网卡

文章目录 35 KVM管理设备-管理虚拟网卡35.1 概述35.2 操作步骤 35 KVM管理设备-管理虚拟网卡 35.1 概述 虚拟网卡类型主要包含virtio-net、vhost-net、vhost-user等。用户在创建虚拟机后&#xff0c;可能会有挂载或者卸载虚拟网卡的需求。openEuler提供了网卡热插拔的功能&am…

springboot+vue宠物领养系统的设计与实现

随着国内经济的不断发展&#xff0c;人民收入水平的提高以及对于情感需求的日益增强&#xff0c;宠物饲养成为了一种流行趋势。宠物的增多不可避免地造成了流浪宠物的泛滥&#xff0c;它们大多来自被主人遗弃的动物或这些动物繁衍的后代。它们没有管束&#xff0c;游走在人类居…

自定义kong插件golang版本

开发一个go版本的kong 插件&#xff0c;通常需要以下3个步&#xff1a; 基于kong提供的go语言版本的PDK编写并且编译kong插件 --》 在kong的kong.conf文件中配置插件位置 --> 通过kong的admin api来启用插件 一、使用go语言编写kong插件 1、定义Config对象 type Config s…

嵌入式软件测试怎么实现自动化测试?

说起嵌入式软件测试&#xff0c;我们先快速了解一下嵌入式软件自身的特点。嵌入式软件具有实时性、内存空间有限、I/O通道少&#xff0c;而且要求功耗低、高可靠性&#xff0c;对成本也比较敏感&#xff0c;和硬件关联性强等特点。因此&#xff0c;嵌入式软件的测试与一般商用软…

【Vue】data属性,v-for,diff算法,composition API

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 Vue3data属性插值语法修饰符v-modelv-for虚拟DOMdiff算法 响应式原理v-for中的keynextTick comp…

Vue3 小兔鲜:项目起步

Vue3 小兔鲜&#xff1a;项目起步 Date: May 31, 2023 创建项目并整理目录 npm init vuelatestsrc目录调整 需要补充创建以下文件&#xff1a; git 管理项目 基于create-vue 创建出来的项目默认没有初始化git仓库&#xff0c;需要我们手动初始化 执行命令井完成首次提交 …

通过脚本将本地文件上传到服务器 WinSCP

通过脚本将本地文件上传到服务器 准备工作 安装好WinSCP软件。服务器上配置了Java环境。 编写脚本 以下是一个使用WinSCP软件的脚本示例&#xff0c;用于将本地的JAR包上传到服务器并启动&#xff1a; echo offset WINSCP_PATH"C:\Program Files (x86)\WinSCP\WinSCP.…

中国人民大学与加拿大女王大学金融硕士项目——在职读金融硕士,没想到收获这么多

随着社会经济的快速发展&#xff0c;金融专业的报考越来越受欢迎。近些年来&#xff0c;市场对于金融专业的高端人才需求不断增加。工作多年的金融人或有计划跳槽到金融领域的群体&#xff0c;都想通过业余时间充电以增强在金融行业的竞争力。在职读金融硕士有用吗&#xff1f;…

基于Element的Select下拉选组件(支持快速全选)

Select下拉选增强 支持快速多选、tooltip等 示例图 1. quicklySelectAll: boolean 在多选模式下支持快速全选取消全选,默认开启 <template><div id"app"><div class"container"><el-form ref"formRef" :model"formD…

Framework开发环境搭建

Framework开发环境搭建 开启Android Framework之旅&#xff0c;一步步记录自己学习过程。 硬件配置 RAM&#xff1a;最低16GB&#xff0c;建议32GB&#xff0c;有条件64GB&#xff0c;内存越高&#xff0c;编译时间越短ROM&#xff1a;最低400GB&#xff0c;代码250GB构建15…

第八篇、基于Arduino uno,获取MAX30102心率传感器的心率信息——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;第一个值是原始的IR值&#xff0c;第二个值是实时的心跳&#xff0c;第三个值是平均心跳&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;MAX30102心率传感器的外观如下…

Linux:开机自动挂载磁盘出错 两种解决办法 /etc/fstab

假如在/etc/fstab文件中有一个错误的语句 但是我们假装不知道&#xff0c;直接给他重启 第一种 开机自动进入到一个这样的界面 在这我们直接输入root的密码 进入到root下 直接 vi /etc/fstab 先将错误的删除掉&#xff0c;等正常开机了再去做挂载 然后重启 正常进入系统 第二…

基于机智云物联网平台的智能种树小车

前言:针对目前人工种树效率低的问题&#xff0c;设计了一种全自助高效智能种树小车。介绍了装置的结构组成&#xff0c;剖析了装置的运动机理。通过SolidWorks三维软件对传动部件进行了结构设计。 利用蓝牙模块实现了种植过程的信息传递、发送命令等&#xff0c;物联网机智云模…

Fiddler+Proxifer 实现PC端软件的抓包

FIddlerProxifer 实现PC端软件的抓包 下载Proxifer https://www.proxifier.com/download/ Proxifier配置 默认是关闭HTTP协议的&#xff0c;使用需要配置开启&#xff0c;配置文件->高级->HTTP代理服务器->启用HTTP代理服务器支持 配置Proxifer代理服务器&#x…