牛客题解 | 头条校招

news/2025/3/4 11:49:37/文章来源:https://www.cnblogs.com/wc529065/p/18750209

题目

题目链接

解题思路

  1. 基本思路:

    • 先对题目难度进行排序。
    • 从最小难度开始,尝试组合每场考试的三道题。
    • 每找到一组题目后,标记这些题目为已使用。
    • 统计需要补充的题目数量。
  2. 实现方法:

    • 使用贪心策略,优先使用难度相近的题目组合。
    • 使用 \(\text{used}\) 数组标记已使用的题目。
    • 对于每组题目,确保相邻题目难度差不超过 \(10\)
    • 计算每组不足三道题时需要补充的题目数量。

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int minExtraQuestions(int n, vector<int>& difficulties) {sort(difficulties.begin(), difficulties.end());vector<bool> used(n, false);int extra = 0;// 从最小的数开始尝试组合for (int i = 0; i < n; i++) {if (used[i]) continue;// 找第一道题int first = difficulties[i];used[i] = true;// 找第二道题int second = -1, second_idx = -1;for (int j = i + 1; j < n; j++) {if (!used[j] && difficulties[j] - first <= 10) {second = difficulties[j];second_idx = j;break;}}// 找第三道题int third = -1, third_idx = -1;if (second != -1) {for (int j = second_idx + 1; j < n; j++) {if (!used[j] && difficulties[j] - second <= 10) {third = difficulties[j];third_idx = j;break;}}}// 计算需要补充的题目数if (second == -1) {  // 只有第一道题extra += 2;} else if (third == -1) {  // 只有两道题used[second_idx] = true;extra += 1;} else {  // 找到三道题used[second_idx] = true;used[third_idx] = true;}}return extra;
}int main() {int n;cin >> n;vector<int> difficulties(n);for (int i = 0; i < n; i++) {cin >> difficulties[i];}cout << minExtraQuestions(n, difficulties) << endl;return 0;
}
import java.util.*;public class Main {public static int minExtraQuestions(int n, int[] difficulties) {Arrays.sort(difficulties);boolean[] used = new boolean[n];int extra = 0;// 从最小的数开始尝试组合for (int i = 0; i < n; i++) {if (used[i]) continue;// 找第一道题int first = difficulties[i];used[i] = true;// 找第二道题int second = -1, second_idx = -1;for (int j = i + 1; j < n; j++) {if (!used[j] && difficulties[j] - first <= 10) {second = difficulties[j];second_idx = j;break;}}// 找第三道题int third = -1, third_idx = -1;if (second != -1) {for (int j = second_idx + 1; j < n; j++) {if (!used[j] && difficulties[j] - second <= 10) {third = difficulties[j];third_idx = j;break;}}}// 计算需要补充的题目数if (second == -1) {  // 只有第一道题extra += 2;} else if (third == -1) {  // 只有两道题used[second_idx] = true;extra += 1;} else {  // 找到三道题used[second_idx] = true;used[third_idx] = true;}}return extra;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] difficulties = new int[n];for (int i = 0; i < n; i++) {difficulties[i] = sc.nextInt();}System.out.println(minExtraQuestions(n, difficulties));}
}
def min_extra_questions(n, difficulties):difficulties.sort()used = [False] * nextra = 0# 从最小的数开始尝试组合for i in range(n):if used[i]:continue# 找第一道题first = difficulties[i]used[i] = True# 找第二道题second = -1second_idx = -1for j in range(i + 1, n):if not used[j] and difficulties[j] - first <= 10:second = difficulties[j]second_idx = jbreak# 找第三道题third = -1third_idx = -1if second != -1:for j in range(second_idx + 1, n):if not used[j] and difficulties[j] - second <= 10:third = difficulties[j]third_idx = jbreak# 根据找到的题目数量计算需要补充的题目if second == -1:  # 只有第一道题extra += 2elif third == -1:  # 只有两道题used[second_idx] = Trueextra += 1else:  # 找到三道题used[second_idx] = Trueused[third_idx] = Truereturn extraif __name__ == "__main__":n = int(input())difficulties = list(map(int, input().split()))print(min_extra_questions(n, difficulties))

算法及复杂度

  • 算法:贪心算法
  • 时间复杂度:\(\mathcal{O}(n^2)\),其中 \(n\) 为题目数量
  • 空间复杂度:\(\mathcal{O}(n)\),用于存储已使用题目的标记

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认识 TapFlow,以编程方式运行 TapData

TapFlow 是 TapData Live Data Platform 最新推出的一个面向编程的API 框架。TapFlow 可以让开发者和数据工程师用一个简单易用而又强大的编程语言来进行数据管道和数据模型的开发工作。**什么是TapFlow? ** TapFlow 是 TapData Live Data Platform 最新推出的一个面向编程的A…

Maya 影视渲染,渲染101 让创作无压力!

Maya 创作时,渲染是不是常让人崩溃?漫长等待、电脑性能不足、报错频出,今天就给大家分享基于渲染 101 平台的 Maya 云渲染,轻松解决这些难题!告别漫长等待,效率飙升**** 自己电脑渲染复杂 Maya 项目,耗时久,进度慢。渲染 101 的云渲染有强大计算集群,众多高性能服务器…

Java SpringBoot 升级后,编译打包都没问题,运行报错

编译打包都没问题,运行报错 10:36:39,587 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@5966cc - Registering current configuration as safe fallback point Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/core…

在Hyper-V虚拟化平台上,怎么创建和管理虚拟机呢?

确实,在Hyper-V虚拟化平台上,创建和管理虚拟机(VMs)是实现资源高效利用和业务灵活部署的关键。以下是对这一观点的详细阐述:一、创建虚拟机:资源高效利用的基础 资源分配与优化: 在创建虚拟机时,管理员需要根据业务需求合理分配CPU、内存、存储和网络等资源。通过精确的…

STM32实战——ESP8266 WIFI模块

此篇博文提供了ESP8266的开发指南,包括在STM32上使用ESP8266进行WiFi连接、发送和接收HTTP请求以及在ESP8266中使用AT指令发送GET方式请求等内容。ESP8266 硬件介绍 ESP8266系列模组有哪些:在本实验中,ESP8266与ESP-01不做区分。 ESP-01引脚介绍:引脚 功能3.3 3.3V供电,避…

一招学会Prometheus对接三方监控平台

文章来源:乐维社区 通过将Prometheus与不同的监控工具和服务集成,企业可以实现对更广泛资源和服务的监控,包括那些不由Prometheus原生支持的系统。这种集成不仅有助于获取更全面、深入的监控数据,还能提升故障排查和性能优化的效率,从而确保系统的稳定性和可靠性。 环境说…

Motoman机器人XRC控制柜维修

在现代工业生产中,YASKAWA机器人扮演着至关重要的角色。然而,如同所有的机械设备一样,YASKAWA机器人也会出现故障,尤其是其控制柜部分。因此,安川机器人维修工作对于保障机器人的正常运行意义非凡,这其中安川机器人控制柜维修更是关键环节。一、常见故障及解决方法1. 电源…

【域攻击】无文件落地攻击:msiexec

msiexec.exe属于系统进程,是Windows Installer的一部分,用于安装Windows Installer安装包(MSI),对系统的正常运行非常重要,一般在运行Microsoft Update安装更新或安装部分软件的时候出现,占用内存比较大,我们亦可以使用其作为无文件落地的媒介,下面举例说明: Step 1:使…

c# hosting 和 AppDomain

前言 简单介绍一下hosting 和 appdomain。 这两个东西。 正文 我们经常听说寄宿,这个寄宿是什么东西呢? 也就是我们这里要介绍的hosting。 什么是寄宿呢? 想一个问题,一个c# 的exe 程序,为啥能够启动呢?我们记得dll中是il代码。 那么肯定要加载运行时对吧。 那么为什么叫…

Dapr 简介 - 分布式应用运行时

Dapr 简介-分布式应用运行时 简介 Whats Dapr? Dapr = Distributed Application Runtime (分布式应用运行时)看到这个词,不知道大家想到了什么?是不是类似于 java runtime,c runtime 这类词汇。网上找到了一个 应用程序、运行时库和 OS 之间的关系图,其中 Runtime 库处于…

Mac脚本发布PHP开发项目到线上

环境 服务器: CentOS Linux release 7.6.1810 (Core) 客户端: macOS Sonoma 14.1.2 (23B92) 测试环境:开发使用ftp自动上传到/www/wwwroot/dirDev文件夹自动备份并发布程序 备份/www/wwwroot/dirOnline文件夹,并将开发项目/www/wwwroot/dirDev自动同步到线上环境/www/wwwro…