关注我们,每天更新大厂最新笔试题解析
前言
文末给大家推荐一下我们的活动,针对校招笔面试全覆盖的全程真一对一的提高,参加活动前会给你安排一个全面的摸底,摸底后会针对你的情况进行分析和对于参加活动的介绍,然后你再决定是否参加!
在线做题链接:https://niumacode.com/
在线做题链接:https://niumacode.com/
小明在年会时得到了一次套圈机会,只要被小明套中的商品都可以全部送给小明。小明对每个商品都有一个喜好值 a_i。小明的套圈技术十分精准,可以指哪套哪,请你帮小明决定一个套圈位置,使得小明能获得的商品喜好值之和最大。你只用告诉小明这个最大值就可以了。 形式化地,n个商品一列排开,小明对其喜好值分别为 a_1, a_2, ..., a_n。套圈的大小为L,即可以任选套圈位置i (1 ≤ i ≤ n-L+1),小明获得的商品为区间 [i, i+L-1],喜好值之和为: a_i + a_{i+1} + a_{i+2} + ... + a_{i+L-1} 你需要决定一个位置i,使得上述喜好值之和最大。你只用输出这个最大值。
第一行 2 个整数分别为 n 和 L,表示商品数量和套圈的大小。 第二行 n 个整数 a_1, a_2, ..., a_n,表示各个商品的喜好值 约束: 1 ≤ L ≤ n ≤ 50000 0 ≤ a_i < 1000
输出一个整数,表示能获得的最大喜好值之和。
输入:
5 3
7 1 2 5 5
输出:
12
从第 3 个位置套圈,套中区间 [3, 5] 内的商品,其喜好值之和为 12,可以证明没有更优选择。
核心是“滑动窗口”。求长度固定的连续子数组的最大和,可以先计算前 L 个元素的和作为初始窗口。接着窗口向右滑动,每次只需加上新进入窗口的元素并减去移出窗口的元素,就能以 O(1) 的时间更新当前和并维护最大值,整体时间复杂度为 O(n)。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// 优化标准输入输出流的性能
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int numItems, ringSize;
if (!(cin >> numItems >> ringSize)) {
return 0;
}
vector<int> preferences(numItems);
for (int i = 0; i < numItems; ++i) {
cin >> preferences[i];
}
long long currentSum = 0;
// 计算第一个窗口(大小为 ringSize)的喜好值之和
for (int i = 0; i < ringSize; ++i) {
currentSum += preferences[i];
}
long long maxSum = currentSum;
// 滑动窗口:减去移出窗口的元素,加上新进入窗口的元素
for (int i = ringSize; i < numItems; ++i) {
currentSum += preferences[i] - preferences[i - ringSize];
if (currentSum > maxSum) {
maxSum = currentSum;
}
}
cout << maxSum << "\n";
return 0;
}
在线做题链接:https://niumacode.com/
在某款角色扮演游戏中,玩家的角色拥有三项核心属性:力量、敏捷和智力。 你的仓库中目前存储了 N 件装备,每一件装备都拥有这三项属性的数值。第 i 件装备的力量值为 x_i,敏捷值为 y_i,智力值为 z_i。需要注意的是,这些数值可能为负数。 为了应对即将到来的高难度副本,你需要从这 N 件装备中恰好挑选出 M 件进行装备。装备穿戴后,角色的最终属性值为所选 M 件装备对应属性值的代数和,即: 最终力量 X = x_1 + x_2 + ... + x_M 最终敏捷 Y = y_1 + y_2 + ... + y_M 最终智力 Z = z_1 + z_2 + ... + z_M 为了追求极致的战斗风格,角色强度评分为三项最终属性值的绝对值之和,即 |X| + |Y| + |Z|。 请计算一下,如何从 N 件装备中挑选 M 件,才能使得角色的强度评分最大?
第一行包含两个整数 N 和 M,分别表示仓库中装备的总数和需要挑选的装备数量。 接下来的 N 行,每行包含三个整数 x_i, y_i, z_i,分别表示第 i 件装备的力量、敏捷和智力属性值。 约束: 1 ≤ M ≤ N ≤ 100000 -10^9 ≤ x_i, y_i, z_i ≤ 10^9
输出一行,一个整数,表示能够达到的最大强度评分。
输入:
5 3
1 -2 3
-4 5 -6
7 -8 -9
-10 11 -12
13 -14 15
输出:
52
在这个例子中,我们可以选择第1、3和第5件装备。 各项属性的总和如下: 力量:1+7+13=21 敏捷:(-2)+(-8)+(-14)=-24 智力:3+(-9)+15=9 此时的强度评分为:|21|+|-24|+19|=21+24 +9=54 可以证明,没有其他方案能获得比54更高的评分。
核心是“绝对值去括号转贪心”。要求 |X| + |Y| + |Z| 的最大值,等价于求 +/- X +/- Y +/- Z 这 8 种符号组合中的最大值。只需枚举这 8 种状态,确定符号后,计算每件装备在该符号下的加权贡献值,从大到小排序并贪心选取前 M 件求和。取 8 种情况求出的最大值即为最终答案。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 使用结构体规范化装备的属性定义
struct Equipment {
long long strength;
long long agility;
long long intelligence;
};
int main() {
// 优化标准输入输出流的性能
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int totalEquipments, selectedEquipments;
if (!(cin >> totalEquipments >> selectedEquipments)) {
return 0;
}
vector<Equipment> equipments(totalEquipments);
for (int i = 0; i < totalEquipments; ++i) {
cin >> equipments[i].strength >> equipments[i].agility >> equipments[i].intelligence;
}
// 初始化为极小值
long long maxScore = -4e18;
// 枚举绝对值展开的 8 种符号组合状态
for (int i = 0; i < 8; ++i) {
long long signStrength = (i & 1) ? 1 : -1;
long long signAgility = (i & 2) ? 1 : -1;
long long signIntelligence = (i & 4) ? 1 : -1;
// 存储当前符号组合下,每件装备的加权贡献值
vector<long long> currentValues(totalEquipments);
for (int j = 0; j < totalEquipments; ++j) {
currentValues[j] = signStrength * equipments[j].strength +
signAgility * equipments[j].agility +
signIntelligence * equipments[j].intelligence;
}
// 贪心策略:将贡献值从大到小排序
sort(currentValues.rbegin(), currentValues.rend());
// 选取前 M 件装备的贡献值之和
long long currentScore = 0;
for (int j = 0; j < selectedEquipments; ++j) {
currentScore += currentValues[j];
}
// 更新全局最大强度评分
if (currentScore > maxScore) {
maxScore = currentScore;
}
}
cout << maxScore << "\n";
return 0;
}
我们是一个针对技术岗(前后端开发、测试、测开、大数据开发、大模型、ai等相关岗位)校招一对一进阶提高的工作室。我们从2020年2月份开始,迄今整整六年的时间,带领900+学员斩获4000+中大厂offer,参加活动的同学人均5个中大厂offer以上,以下是我们活动内容的介绍! 万诺coding
我们主要是针对有一定基础的同学提供全程一对一笔试、面试辅导,针对每个同学不同的情况定制内容,包括但不限于“笔试及面试算法”/“基础八股/“项目及实习梳理”/“面试技巧”/“面试复盘”等内容。
摸底测试:如果有兴趣深入了解我们的活动,需要先参加我们的“摸底测试”(类似面试),方便我们了解你的具体情况(主要是code能力和计算机素养),定制出相应的辅导计划。摸底测试后,我们会定制化一个针对性的提高计划。然后你再考虑是否参加我们的活动。
承诺保offer:通过摸底测试后,我们会针对每个同学的情况给定一个“保offer”计划。然后同学可以根据自己的实际情况考虑参不参加我们的活动。
有兴趣的同学可以扫码添加我们的微信(whynotlab)
