携程2025秋招0919笔试详细解答C++

news2024/9/21 18:47:07

这里写目录标题

  • 计算网格内走k步获取的最大价值
  • 选m个极差不超过k的数消掉最小的数,求剩余最少的数字数量
  • 选k个长度不超过l的区间改变数字,求最后剩余的最小数字

计算网格内走k步获取的最大价值

一个 n x m 的网格图 a,左上角为(0,0),右下角为(n-1,m-1),格子 (i,j) 价值为 i * m + j。
游游从左上角 (0,0) 为起点,每一步可以走到上下左右四个方向的相邻格子。
每到达一个格子,就能获取相应格子的奖励。
需要注意的是,在到达某个格子获取宝物后,这个格子的宝物会在游游离开格子后再次刷新。
现在给出一个整数 k,表示游游最多走 k 步。问:游游最多能获得多少价值的宝物?
输入:
第一行输入 q(1 <= q <= 10 ^ 5),表示询问个数。
接下来 q 行,每行输入 n,m,k (1 <= n, m, k <= 10^4, n + m > 2),表示矩阵大小和限制步数。

思路非常直白,先下再右再左右横跳,无论是下还是右都可以用等差数列求解,至于左右横跳只需要分奇偶

//先往下走,再往右走,再左右横跳
#include <iostream>
using namespace std;
#define ll long long
void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    ll ans = 0;
    //可以到达底部
    if (k >= n - 1) {
        ans = n * m / 2 * (n - 1) * 1ll;
        k -= (n - 1);
    }
    else {
        ans = k * m * (k + 1) / 2 * 1ll;
        k = 0;
    }
    //可以走到最右侧
    int last = (n - 1) * m;//最后一行第一个格子的宝藏
    if (k >= m - 1) {
        ans += (last + 1 + last + m - 1) * (m - 1) / 2 * 1ll;
        k -= (m - 1);
    }
    else {
        ans += (last + 1 + last + k) * k / 2 * 1ll;
        k = 0;
    }
    //需要反复横跳
    last = n * m - 1;//最后一行最后一个格子的宝藏
    int pre = last - 1;//last的前一个格子
    if (k > 0) {
        //如果k是偶数,那么last和pre都可以被访问k/2次
        if (k % 2 == 0) ans += k / 2 * (last + pre);
        else ans += (k + 1) / 2 * pre + k / 2 * last;
    }
    cout << ans << endl;

}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

选m个极差不超过k的数消掉最小的数,求剩余最少的数字数量

游游在黑板上写下了 n 个数字,构成了一个可重集合。
游游请你参与一个游戏 :
每轮操作你可以任选集合中**最大值和最小值的差不超过 k **的 m 个数字,
然后删去这 m 个数字中的最小值(删除一个),
并把其他的数字放回集合中。
若无法选出符合条件的m个数,则无法继续操作。
你可以无限次进行这个操作,直到没法操作为止。
要使得最后留下的数最少,请你求出操作后留下的最少的数字数量。
输入:
第一行三个整数n,m,k (2 <= m <= 106, 0 <= k <= 109)
第二行输入n个整数
输入:
4 3 3
1 2 3 6
输出:
3

题目看几遍都没看懂
看懂之后感觉自己很傻逼
每轮操作你可以任选集合中最大值和最小值的差不超过 k 的 m 个数字
这段话咱像分析英语句子一样给他拆开,形容词给他不要了
每轮操作你可以任选集合中最大值和最小值的差不超过 k 的 m 个数字
什么意思?让你维护一个长度为m的数组啊!

eg:
输入:
4 3 3
1 2 3 6
n = 4,m = 3,k = 3,有4个数,每次操作选3个,最大值和最小值的差不超过3

  • {1,2,3}它们的最大值和最小值之差是 3 - 1 = 2,符合条件。删掉1,剩下{2, 3, 6}
  • {2, 3, 6},无法再选择出符合条件的 3 个数字(因为 6 - 2 = 4,超过 k = 3),游戏结束。

eg:
输入:
5 3 2
5 4 4 2 1
{5, 4, 4, 2, 1},排序后变成 {1, 2, 4, 4, 5}

  • {1, 2, 4},最大值与最小值的差是 4 - 1 = 3,不符合条件。
  • {2, 4, 4},最大值与最小值的差是 4 - 2 = 2,符合条件。删掉 2,剩下 {4, 4, 5}。
  • {4, 4, 5},最大值与最小值的差是 5 - 4 = 1,符合条件。删掉 4,剩下 {4, 5}。游戏结束。最后是{1,4,5},答案3。

无语死了家人们,看不懂题做一天,看懂题三分钟

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> a(n);

    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    sort(a.begin(), a.end()); // 从小到大排序

    int ans = n;
    //维护一个定长数组
    for (int i = 0; i <= a.size() - m; i ++) {
        if (a[i + m - 1] - a[i] <= k) ans--;
    }
    cout << ans;
}

选k个长度不超过l的区间改变数字,求最后剩余的最小数字

游游有个 n 人组成的合唱团,第 i 个人的能力值为 ai 。现在将 n 个人排成一排,游游有 k 次训练的机会,让不超过 l 个连续的人能力人变为任意值。如果合唱团的实力是所有人能力值的最小值。你可以帮助游游求出合唱团的实力的最大值是多少吗?
输入描述:
第一行三个整数n,k,l,表示人数,训练次数,每次训练的最大长度。(2 <= n <= 10^5, 1 <= k * l < n) 第二行n个整数ai,表示第i个人的能力值为ai(1 <= ai <= 1e9)

背景:
合唱团n个人,每个人能力值a[i],合唱团的实力定义为合唱团中所有人的最小能力值、
你有k次训练机会,每次可以改变连续l个人的能力值,改变之后可以是任意值,你希望合唱团整体实力尽可能高。
目标:
通过k次训练,让合唱团的最小能力值尽可能地大

思路:
先排序一个a,保留原始数组b
在排过序的数组a中二分法找中间值,当做可能答案一个个试
假设当前mid就是最终的最小数,用check函数去判断,能不能以原数组为基础,将所有小于当前mid值的元素都提高
如果可以,先保留res,增加mid,即left+1
如果不能,就减小mid,即right-1

至于check函数,起始位置i,一个个试,
当前i值小于参数传递来的val,说明需要训练,标记训练++,i跳l个位置
当前i值大于参数传递来的val,说明不需要训练,i++
把所有元素试完,最后返回训练次数小于等于k


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, k, l;
int res;
bool check(vector<int>& b, int val) {
	// 假设这个函数检查能否通过至多 k 次训练,让所有人的能力至少为 val
	int need_trainings = 0;
	int i = 0;
	while (i < n) {
		if (b[i] < val) {
			need_trainings++;
			i += l;
		}
		else {
			i++;
		}
	}
	return need_trainings <= k;
}
int main() {
	cin >> n >> k >> l;
	vector<int> a(n, 0);
	vector<int> b(n, 0);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
		b[i] = a[i];
	}
	sort(a.begin(), a.end());
	int left = 0, right = a.size() - 1;
	while (left <= right) {
		int mid = left + (right - left) / 2;
		if (check(b, a[mid])) {
			res = mid;//先保留这一版本的res
			left = mid + 1;
		}
		else {
			right = mid - 1;
		}
	}
	cout << a[res];
}

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

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

相关文章

十大排序(一):冒泡排序

目录 一、简介 实现过程 时间复杂度 二、代码实现 函数声明 Swap函数 单趟 多趟 测试 优化 一、简介 冒泡排序是一种简单的排序算法&#xff0c;它重复地比较相邻的两个元素&#xff0c;如果顺序错误就交换它们&#xff0c;直到没有元素需要交换为止。这个过程类…

获取zabbix API 监控数据shell脚本,自动日常巡检服务器信息、并发送指定群组

一&#xff0c;前言 有zabbix监控&#xff0c;也并不是时刻盯着数据&#xff0c;所以想着&#xff0c;每天固定某个时刻&#xff0c;自动发送服务器数据到指定群组&#xff0c;给其他人更直观的数据。 数据就可以从zabbix API获取。参考官方API文档&#xff1a;https://www.z…

如何使用IIC外设(硬件IIC)

本文重点叙述如何使用芯片自带的 IIC 外设&#xff0c;即硬件 IIC&#xff0c;实现 IIC 通信。文章《IIC通信基础_cpu的iic通信-CSDN博客》 中&#xff0c;叙述了软件 IIC 通信和硬件 IIC 通信的区别&#xff0c; 并且重点叙述了 IIC 的通信协议。在使用软件进行 IIC 通信时&am…

git安装包夸克网盘下载

git安装包夸克网盘下载 git夸克网盘 git网站上的安装包下载速度有点慢&#xff0c;因此为了方便以后下载就将文件保存到夸克网盘上&#xff0c;链接&#xff1a;我用夸克网盘分享了「git」&#xff0c;点击链接即可保存。 链接&#xff1a;https://pan.quark.cn/s/07c73c4a30…

MongoDB在Linux系统中的安装与配置指南

在这篇文章中&#xff0c;我们将介绍如何在CentOS 7服务器上安装MongoDB&#xff0c;并通过DataX将数据从MongoDB迁移到MySQL数据库。这将包括MongoDB的安装、配置、数据准备以及使用DataX进行数据迁移的详细步骤。 MongoDB简介 MongoDB是一个高性能、开源、无模式的文档型数据…

c++9月20日

1.思维导图 2.顺序表 头文件 #ifndef RECTANGLE_H #define RECTANGLE_H#include <iostream>using namespace std;using datatype int ;//类型重定义class Seqlist { private://私有权限datatype *ptr; //指向堆区申请空间的起始地址int size;//堆区空间的长度int len …

鸿蒙OS 线程间通信

鸿蒙OS 线程间通信概述 在开发过程中&#xff0c;开发者经常需要在当前线程中处理下载任务等较为耗时的操作&#xff0c;但是又不希望当前的线程受到阻塞。此时&#xff0c;就可以使用 EventHandler 机制。EventHandler 是 HarmonyOS 用于处理线程间通信的一种机制&#xff0c…

Spring Boot助力高校心理辅导系统升级

3 系统分析 3.1可行性分析 在进行可行性分析时&#xff0c;我们通常根据软件工程里方法&#xff0c;通过四个方面来进行分析&#xff0c;分别是技术、经济、操作和法律可行性。因此&#xff0c;在基于对目标系统的基本调查和研究后&#xff0c;对提出的基本方案进行可行性分析。…

如何着手创建企业数据目录?(三)权限管理及版本控制

前文导读&#xff1a; 《如何着手创建企业数据目录&#xff1f;&#xff08;一&#xff09;数据目录的设定》 《如何着手创建企业数据目录&#xff1f;&#xff08;二&#xff09;数据的命名与维护》 前面聊过了数据目录的设定、数据命名规则和维护规则&#xff0c;今天我们继续…

【java实现json转化为CSV文件】

文章目录 JSON文件中的数据格式测试文件转换的接口 JSON文件中的数据格式 单条数据展开后如下&#xff1a; {"text": "《邪少兵王》是冰火未央写的网络小说连载于旗峰天下","spo_list":[{"predicate": "作者", "objec…

Windows环境下搭建MySQL主从同步实现读写分离

文章目录 前言读写分离的基本原理 环境介绍及说明主库my.ini初始配置创建用于同步的数据库和表 一、新增mysql从库1.复制mysql文件夹2.修改从库的my.ini3.安装到windows服务 二、在my.ini中配置主、从库相关参数1.主库新增配置参数不同版本参数不同问题 2.从库新增配置参数3.删…

rabbitmq 短信验证码

1.生成的验证码用redis存 减少数据库压力 2.通知运营商发送短信的事情交给rabbitmq的队列去做&#xff0c;无论成功或者是失败&#xff0c;用户那边都不知道。没有收到验证码&#xff08;监听失败&#xff09;用户只会觉得是运营商的问题&#xff0c;而不会怀疑是我们的系统有问…

Linux文件IO(四)-返回错误处理与errno详解

1.前言 在上一文章中&#xff0c;给大家编写了很多的示例代码&#xff0c;大家会发现这些示例代码会有一个共同的特点&#xff0c;那就是当判断函数执行失败后&#xff0c;会调用 return 退出程序&#xff0c;但是对于我们来说&#xff0c;我们并不知道为什么会出错&#xff0…

C++进阶|多态知识点详解及经典面试题总结

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 目录 1. 多态的概念 2. 多态的定义及实现 2.1 多态的构成条件 2.2 虚函数的重写/覆盖 2.3 虚函数重写的⼀些其他问题 2.4 override 和 final关键字 2.5 重载/重写/隐藏的…

(笔记自用)位运算总结+LeetCode例题:颠倒二进制位+位1的个数

一.位运算总结: 在解题之前理解一下为什么需要位运算&#xff1f;它的本质是什么&#xff1f; 力扣上不少位运算相关的题&#xff0c;并且很多题也会用到位运算的技巧。这又是为什么&#xff1f; 位运算的由来 在计算机里面&#xff0c;任何数据最终都是用数字来表示的&…

mysqldump使用cmd窗口和powersell窗口导出sql中文乱码的问题

项目场景 我在使用Mariadb数据库更新数据的时候&#xff0c;由于数据库的表格中含有中文&#xff0c;在使用mysqldump导出sql语句的时候&#xff0c;中文显示乱码&#xff0c;如下图所示&#xff1a; 环境描述 系统&#xff1a;windows10数据库&#xff1a; Mariadb -10.6.16…

Vue2中路由的介绍和使用

一.路由的基本概念 一说路由&#xff0c;大家首先想到的可能是路由器&#xff0c;路由器的原理就是给连接的设备一个IP地址&#xff0c;通过IP地址来映射到设备&#xff0c;实现连接&#xff0c;本质上是一种映射关系。 在vue2中就是路径与组件间的映射。 路由是使用vue2制作…

Python爬虫使用实例-umei

优美图库 www.umei.cc BV1Ag41137re 1/获取资源 查看网站资源结构 多页&#xff0c;每个item只有一张图 多页&#xff0c;每个item都是一个图集 最大页码 内外层图集均有若干page。 通过尾页按钮确定pageNum&#xff1a; 2/发送请求 response requests.get(urlurl, header…

快速将Mongo Compass的shell语句转成java代码

步骤一、从MongoCompass中获取java代码 将java代码复制出来&#xff0c;从MongoCompass中复制的java代码基本格式如下&#xff1a;&#xff08;是Bson原生格式&#xff09; List<Document> list Arrays.asList(new Document("$match",new Document("name…

探索视频美颜SDK与直播美颜工具的开发实践方案

直播平台的不断发展&#xff0c;让开发出性能优异、效果自然的美颜技术&#xff0c;成为了技术团队必须面对的重要挑战。本篇文章&#xff0c;小编将深入讲解视频美颜SDK与直播美颜工具的开发实践方案。 一、视频美颜SDK的核心功能 视频美颜SDK是视频处理中的核心组件&#xf…