【OD】【E卷】【真题】【100分】补种未成活胡杨(PythonJavajavaScriptC++C)

题目描述

近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。

一个月后,有M棵胡杨未能成活。

现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树?

输入描述

N 总种植数量,1 <= N <= 100000

M 未成活胡杨数量,M 个空格分隔的数,按编号从小到大排列,1 <= M <= N

K 最多可以补种的数量,0 <= K <= M

输出描述

最多的连续胡杨棵树

示例1

输入

5
2
2 4
1

输出

3

说明

补种到2或4结果一样,最多的连续胡杨棵树都是3。

示例2

输入

10
3
2 4 7
1

输出

6

说明

种第7棵树,最多连续胡杨树棵数位6(5,6,7,8,9,10)

解题思路

这道题目主要是考察如何通过补种胡杨树,使得胡杨树形成【最长的连续序列】。

示例解释

示例1

输入:

5
2
2 4
1

解释:

  • 胡杨树总共有 5 棵,编号分别是 1, 2, 3, 4, 5。
  • 未成活的胡杨树编号是 2 和 4。
  • 只能补种 1 棵树。

选择补种位置:

  • 可以补种编号为2的树,得到序列 1, 2, 3,最多连续 3 棵树。
  • 或者补种编号为4的树,得到序列 3, 4, 5,同样可以得到最多连续 3 棵树。

因此,输出结果为 3

示例2

输入:

10
3
2 4 7
1

解释:

  • 胡杨树总共有 10 棵,编号分别是 1 到 10。
  • 未成活的胡杨树编号是 2, 4, 7。
  • 只能补种 1 棵树。

选择补种位置:

  • 如果补种编号为7的树,可以形成最长连续序列 5, 6, 7, 8, 9, 10,连续的胡杨树棵数为 6
  • 其他补种选择(如2或4)得到的最长连续胡杨树棵数较少。

因此,输出结果为 6

代码思路

基本与下题一致:

1004. 最大连续1的个数 III

参考题解:https://leetcode.cn/problems/max-consecutive-ones-iii/solutions/608931/zui-da-lian-xu-1de-ge-shu-iii-by-leetcod-hw12/

双指针解法,容易理解

Java

import java.util.*;public class Main {public static void main(String[] args) {// 创建一个扫描器对象,用于读取输入Scanner scanner = new Scanner(System.in);// 读取总共的胡杨树数量int total = scanner.nextInt();// 读取未成活的胡杨树数量int deadCount = scanner.nextInt();// 创建一个数组来表示每棵树是否成活,0表示成活,1表示未成活int[] nums = new int[total];// 初始化数组,所有元素设为0,表示所有树最初都是成活的Arrays.fill(nums, 0);// 根据输入,将未成活的树的位置标记为1for (int i = 0; i < deadCount; i++) {int num = scanner.nextInt();nums[num - 1] = 1; // 树的编号从1开始,因此需要减1}// 读取可以补种的树的数量int supplementCount = scanner.nextInt();// 初始化滑动窗口的左右边界int left = 0;int maxLen = 0; // 用于存储最大连续成活区域的长度int sumLeft = 0; // 滑动窗口左边界的未成活树数量int sumRight = 0; // 滑动窗口右边界的未成活树数量// 遍历所有的树,right代表滑动窗口的右边界for (int right = 0; right < total; right++) {sumRight += nums[right]; // 更新右边界的未成活树数量// 如果窗口内的未成活树数量大于可以补种的数量while (sumRight - sumLeft > supplementCount) {sumLeft += nums[left]; // 缩小窗口,左边界右移left++;}// 更新最大成活区域的长度maxLen = Math.max(maxLen, right - left + 1);}// 输出最大连续成活区域的长度System.out.println(maxLen);}
}

Python

# 读取胡杨树的总数N
total = int(input())# 读取未成活胡杨树的数量M
dead_count = int(input())# 读取未成活胡杨树的编号列表
dead_list = list(map(int, input().split()))# 读取可以补种的胡杨树数量K
supplement_count = int(input())# 初始化数组,所有树最初都是成活的,0表示成活,1表示未成活
nums = [0] * total# 根据输入,将未成活的树的位置标记为1
for num in dead_list:nums[num - 1] = 1  # 树的编号从1开始,因此需要减1# 初始化滑动窗口的左右边界
left = 0
max_len = 0  # 用于存储最大连续成活区域的长度
sum_left = 0  # 滑动窗口左边界的未成活树数量
sum_right = 0  # 滑动窗口右边界的未成活树数量# 遍历所有的树,right代表滑动窗口的右边界
for right in range(total):sum_right += nums[right]  # 更新右边界的未成活树数量# 如果窗口内的未成活树数量大于可以补种的数量while sum_right - sum_left > supplement_count:sum_left += nums[left]  # 缩小窗口,左边界右移left += 1# 更新最大成活区域的长度max_len = max(max_len, right - left + 1)# 输出最大连续成活区域的长度
print(max_len)

JavaScript

const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout
});const inputLines = [];
rl.on('line', (input) => {inputLines.push(input);
});rl.on('close', () => {// 读取胡杨树的总数Nconst total = parseInt(inputLines[0]);// 读取未成活胡杨树的数量Mconst deadCount = parseInt(inputLines[1]);// 读取未成活胡杨树的编号列表const deadList = inputLines[2].split(' ').map(Number);// 读取可以补种的胡杨树数量Kconst supplementCount = parseInt(inputLines[3]);// 初始化数组,所有树最初都是成活的,0表示成活,1表示未成活const nums = new Array(total).fill(0);// 根据输入,将未成活的树的位置标记为1deadList.forEach(num => {nums[num - 1] = 1; // 树的编号从1开始,因此需要减1});// 初始化滑动窗口的左右边界let left = 0;let maxLen = 0; // 用于存储最大连续成活区域的长度let sumLeft = 0; // 滑动窗口左边界的未成活树数量let sumRight = 0; // 滑动窗口右边界的未成活树数量// 遍历所有的树,right代表滑动窗口的右边界for (let right = 0; right < total; right++) {sumRight += nums[right]; // 更新右边界的未成活树数量// 如果窗口内的未成活树数量大于可以补种的数量while (sumRight - sumLeft > supplementCount) {sumLeft += nums[left]; // 缩小窗口,左边界右移left++;}// 更新最大成活区域的长度maxLen = Math.max(maxLen, right - left + 1);}// 输出最大连续成活区域的长度console.log(maxLen);
});

C++

#include <iostream>
#include <vector>
#include <algorithm> using namespace std;int main() {int total, deadCount;cin >> total >> deadCount;// 初始化数组,所有树最初都是成活的,0表示成活,1表示未成活vector<int> nums(total, 0);// 根据输入,将未成活的树的位置标记为1for (int i = 0; i < deadCount; i++) {int num;cin >> num;nums[num - 1] = 1; // 树的编号从1开始,因此需要减1}// 读取可以补种的树的数量int supplementCount;cin >> supplementCount;// 初始化滑动窗口的左右边界int left = 0, maxLen = 0, sumLeft = 0, sumRight = 0;// 遍历所有的树,right代表滑动窗口的右边界for (int right = 0; right < total; right++) {sumRight += nums[right]; // 更新右边界的未成活树数量// 如果窗口内的未成活树数量大于可以补种的数量while (sumRight - sumLeft > supplementCount) {sumLeft += nums[left]; // 缩小窗口,左边界右移left++;}// 更新最大成活区域的长度maxLen = max(maxLen, right - left + 1);}// 输出最大连续成活区域的长度cout << maxLen << endl;return 0;
}

C语言

#include <stdio.h>
#include <stdlib.h>// 定义一个max函数,用于求两个数中的最大值
int max(int a, int b) {return (a > b) ? a : b;
}int main() {int total, deadCount;scanf("%d %d", &total, &deadCount);// 初始化数组,所有树最初都是成活的,0表示成活,1表示未成活int *nums = (int *)calloc(total, sizeof(int));// 根据输入,将未成活的树的位置标记为1for (int i = 0; i < deadCount; i++) {int num;scanf("%d", &num);nums[num - 1] = 1; // 树的编号从1开始,因此需要减1}// 读取可以补种的树的数量int supplementCount;scanf("%d", &supplementCount);// 初始化滑动窗口的左右边界int left = 0, maxLen = 0, sumLeft = 0, sumRight = 0;// 遍历所有的树,right代表滑动窗口的右边界for (int right = 0; right < total; right++) {sumRight += nums[right]; // 更新右边界的未成活树数量// 如果窗口内的未成活树数量大于可以补种的数量while (sumRight - sumLeft > supplementCount) {sumLeft += nums[left]; // 缩小窗口,左边界右移left++;}// 更新最大成活区域的长度maxLen = max(maxLen, right - left + 1);}// 输出最大连续成活区域的长度printf("%d\n", maxLen);// 释放动态分配的内存free(nums);return 0;
}

单指针解法,比较难理解

Java

import java.util.Scanner;
import java.util.ArrayList;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取胡杨树的总数Nint total = scanner.nextInt();// 读取未成活胡杨树的数量Mint deadCount = scanner.nextInt();// 存储未成活胡杨树编号的列表ArrayList<Integer> deadList = new ArrayList<>();// 读取未成活胡杨树的编号for (int i = 0; i < deadCount; i++) {int num = scanner.nextInt();deadList.add(num);}// 读取可以补种的胡杨树数量Kint supplementCount = scanner.nextInt();// 初始化最大连续胡杨树的长度int maxLen = 0;// 遍历可能的补种位置,寻找最长连续胡杨树的长度for (int i = supplementCount - 1; i < deadCount; i++) {if (i == supplementCount - 1) {// 考虑补种后,从开头到第一个无法成活的区域maxLen = Math.max(maxLen, supplementCount == deadCount ? total : deadList.get(supplementCount) - 1);} else if (i == deadCount - 1) {// 考虑补种后,从最后一个无法成活的区域到结尾maxLen = Math.max(maxLen, total - deadList.get(i - supplementCount));} else {// 计算补种后的最大连续胡杨树maxLen = Math.max(maxLen, deadList.get(i + 1) - deadList.get(i - supplementCount) - 1);}}// 输出结果System.out.println(maxLen);}
}

Python

# 读取胡杨树的总数N
total = int(input())# 读取未成活胡杨树的数量M
deadCount = int(input())# 读取未成活胡杨树的编号列表
deadList = list(map(int, input().split()))# 读取可以补种的胡杨树数量K
supplementCount = int(input())# 初始化最大连续胡杨树的长度
maxLen = 0# 遍历可能的补种位置,寻找最长连续胡杨树的长度
for i in range(supplementCount-1, deadCount):if i == supplementCount-1:# 考虑补种后,从开头到第一个无法成活的区域maxLen = max(maxLen, total if supplementCount == deadCount else deadList[supplementCount]-1)elif i == deadCount-1:# 考虑补种后,从最后一个无法成活的区域到结尾maxLen = max(maxLen, total - deadList[i-supplementCount])else:# 计算补种后的最大连续胡杨树maxLen = max(maxLen, deadList[i+1]-deadList[i-supplementCount]-1)# 输出结果
print(maxLen)

JavaScript

const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let totalNum, deadNum, deadIdx, maxReplantNum;rl.on('line', (input) => {if (!totalNum) {// 读取胡杨树的总数NtotalNum = parseInt(input);} else if (!deadNum) {// 读取未成活胡杨树的数量MdeadNum = parseInt(input);} else if (!deadIdx) {// 读取未成活胡杨树的编号列表deadIdx = input.split(' ').map(Number);} else {// 读取可以补种的胡杨树数量KmaxReplantNum = parseInt(input);let max = 0;// 遍历可能的补种位置,寻找最长连续胡杨树的长度for (let i = maxReplantNum - 1; i < deadNum; i++) {if (i === maxReplantNum - 1) {// 考虑补种后,从开头到第一个无法成活的区域max = Math.max(max, maxReplantNum === deadNum ? totalNum : deadIdx[maxReplantNum] - 1);} else if (i === deadNum - 1) {// 考虑补种后,从最后一个无法成活的区域到结尾max = Math.max(max, totalNum - deadIdx[i - maxReplantNum]);} else {// 计算补种后的最大连续胡杨树max = Math.max(max, deadIdx[i + 1] - deadIdx[i - maxReplantNum] - 1);}}// 输出结果console.log(max);rl.close();}
});

C++

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {// 读取胡杨树的总数Nint total;int deadCount;cin >> total >> deadCount;// 存储未成活胡杨树编号的列表vector<int> deadList;for (int i = 0; i < deadCount; i++) {int num;cin >> num;deadList.push_back(num);}// 读取可以补种的胡杨树数量Kint supplementCount;cin >> supplementCount;// 初始化最大连续胡杨树的长度int maxLen = 0;// 遍历可能的补种位置,寻找最长连续胡杨树的长度for (int i = supplementCount - 1; i < deadCount; i++) {if (i == supplementCount - 1) {// 考虑补种后,从开头到第一个无法成活的区域maxLen = max(maxLen, supplementCount == deadCount ? total : deadList[supplementCount-1] - 1);} else if (i == deadCount - 1) {// 考虑补种后,从最后一个无法成活的区域到结尾maxLen = max(maxLen, total - deadList[i - supplementCount]);} else {// 计算补种后的最大连续胡杨树maxLen = max(maxLen, deadList[i + 1] - deadList[i - supplementCount] - 1);}}// 输出结果cout << maxLen << endl;return 0;
}

C语言

#include <stdio.h>
#include <stdlib.h>int main() {// 读取胡杨树的总数Nint total, deadCount;scanf("%d %d", &total, &deadCount);// 分配内存用于存储未成活胡杨树的编号int* deadList = (int*)malloc(deadCount * sizeof(int));for (int i = 0; i < deadCount; i++) {scanf("%d", &deadList[i]);}// 读取可以补种的胡杨树数量Kint supplementCount;scanf("%d", &supplementCount);// 初始化最大连续胡杨树的长度int maxLen = 0;// 遍历可能的补种位置,寻找最长连续胡杨树的长度for (int i = supplementCount - 1; i < deadCount; i++) {if (i == supplementCount - 1) {// 考虑补种后,从开头到第一个无法成活的区域maxLen = maxLen > (supplementCount == deadCount ? total : deadList[supplementCount] - 1) ? maxLen : (supplementCount == deadCount ? total : deadList[supplementCount] - 1);} else if (i == deadCount - 1) {// 考虑补种后,从最后一个无法成活的区域到结尾maxLen = maxLen > (total - deadList[i - supplementCount]) ? maxLen : (total - deadList[i - supplementCount]);} else {// 计算补种后的最大连续胡杨树maxLen = maxLen > (deadList[i + 1] - deadList[i - supplementCount] - 1) ? maxLen : (deadList[i + 1] - deadList[i - supplementCount] - 1);}}// 输出结果printf("%d\n", maxLen);// 释放分配的内存free(deadList);return 0;
}

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

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

相关文章

C++进阶:AVL树实现

目录 一.AVL的概念 二.AVL的实现 2.1AVL树的结构 2.2AVL树的插入 2.2.1AVL树插入一个值的大概过程 2.2.2平衡因子更新 2.2.3插入节点及更新平衡因子的实现 2.3旋转 2.3.1旋转的原则 2.3.2右单旋 2.3.3右单旋的代码实现 2.3.4左单旋 2.3.5左单旋的代码实现 2.3.6…

vue综合指南(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:vue综合指南(二) 目录 21、介绍虚拟DOM 22、vue生命周期的理解 23、vue父组件向子组件传递数据…

STM32_实验5_中断实验

通过外部中断来检测四个按键按下的状态&#xff1a; WK_UP 控制蜂鸣器响和停 KEY0 控制 LED_R 互斥点亮 KEY1 控制 LED_G 互斥点亮 KEY2 控制 LED_B 互斥点亮。 中断的基本概念&#xff1a; 中断请求&#xff08;IRQ&#xff09;&#xff1a; 当发生某个特定事件&#xff08;例…

【问题解决】——当出现0xc000007b和缺少mfc140.dll时,该怎么做才能让软件可以打开

目录 事情起因 问题处理 明确定义 填坑之路 最后我是怎么解决的&#xff08;不想看故事直接到这里&#xff09; 事情起因 最近想要重新安装西门子博途来做西门子的一些算法的时候&#xff0c;发现自己软件装的是V15.1的版本&#xff0c;而买的plc1200固件版本要求至少16以…

(AtCoder Beginner Contest 375)D - ABA

&#xff08;AtCoder Beginner Contest 375&#xff09;D - ABA 题目大意 给定一个只包含大写字母的字符串S&#xff0c;求解其长度为3的回文字序列个数 思路 首先暴力枚举区间计算答案 O ( ∣ S ∣ 2 ) O(|S|^2) O(∣S∣2) 一定是会超时的 我们考虑使用前缀和思想 我们对于…

推荐IDE中实用AI编程插件,目前无限次使用

插件介绍 一款字节跳动推出的“基于豆包大模型的智能开发工具” 以vscode介绍【pycharm等都可以啊】&#xff0c;这个插件提供智能补全、智能预测、智能问答等能力&#xff0c;节省开发时间 直接在IDE中使用&#xff0c;就不用在网页中来回切换了 感觉还可以&#xff0c;响应速…

【SQL实验】 设计主码、check约束 、外码(SSMS 菜单操作)

设计主码 PK——主码 右键点击所需的表&#xff0c;选择“设计”。 选择需要作为主键的列&#xff0c;右键点击并选择“设为主键”。 保存更改&#xff0c;确保主键设置生效。 如果出现下图&#xff1a; 解决方式&#xff1a; 把√取消掉&#xff0c;修改后&#xff1a; 确定…

告别ELK,APO提供基于ClickHouse开箱即用的高效日志方案——APO 0.6.0发布

ELK一直是日志领域的主流产品&#xff0c;但是ElasticSearch的成本很高&#xff0c;查询效果随着数据量的增加越来越慢。业界已经有很多公司&#xff0c;比如滴滴、B站、Uber、Cloudflare都已经使用ClickHose作为ElasticSearch的替代品&#xff0c;都取得了不错的效果&#xff…

【Echarts 实战指南】解锁动态历史曲线之谜

在工作中&#xff0c;大家是否曾遇到过这样一种需求呢&#xff1f;需获取设备最近 10 分钟的历史数据。设备实时数据每 2 秒推送一次&#xff0c;且要把历史数据曲线变成动态变化的状态。倘若设备最近 10 分钟的历史数据为 20 个点&#xff0c;那么现在每 2 秒就要将最前面的点…

计算机毕业设计Python深度学习房价预测 房源可视化 房源爬虫 二手房可视化 二手房爬虫 递归决策树模型 机器学习 深度学习 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 房地产是促进我国经济持续增…

车辆管理新篇章:SpringBoot技术解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

电感的学习

电感是表示电路中电流变化对电压影响的物理量&#xff0c;常用符号 LLL 表示。电感的基本公式可以从其定义和基本特性中得出&#xff0c;主要包括以下几个方面&#xff1a; 1. 电感的定义 2. 电感能量存储 3. 自感与互感 自感&#xff1a;电感器自身的电感&#xff0c;表示电…

stata基本操作

文章目录 数据导入及存储变量的标签、审视数据变量的标签审视数据数据删除数据排序 画图直方图使用帮助文件散点图 统计分析描述性分析频数分析相关分析 生成新变量、计算器、终止命令生成新变量设置哑变量修改变量名更改变量内容调用命令和终止命令 日志命令库更新、学习资源 …

从零开始学PHP之helloworld

前言 每一门编程语言的第一个程序就是输出hell world&#xff08;别杠&#xff0c;杠就是你对&#xff09; 开始 上一篇讲完了开发环境的安装&#xff0c;这次讲编辑器的安装&#xff0c;顺带完成上一篇的作业&#xff08;输出hello world&#xff09; 安装PHPstorm 我用的…

基于SpringBoot+Vue的旅游服务平台【提供源码+答辩PPT+参考文档+项目部署】

&#x1f4a5; ① 前言&#xff1a;这两年毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的JavaWeb项目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff01; ❗② 如何解决这类问题&#xff1f; 让我们能够顺利通过毕业&#xff0c;我也一直在不断思考、…

用自己的数据集复现YOLOv5

yolov5已经出了很多版本了&#xff0c;这里我以目前最新的版本为例&#xff0c;先在官网下载源码&#xff1a;GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite 然后下载预训练模型&#xff0c;需要哪个就点击哪个模型就行&am…

机器视觉入门基础相关概念一 ——单目相机模型

机器视觉入门基础相关概念 相机模型 引言介绍&#xff1a;如果只是希望获取图像上的一些信息&#xff08;例如特征提取、拟合等&#xff09;&#xff0c;那么我们不会对三维空间中相机的位置有所要求。但如果希望通过二维的图像去理解三维空间中摄像机的信息&#xff0c;或者是…

【Qt】控件——Qt按钮类控件、常用的按钮类控件、按钮类控件的使用、Push Button、Radio Button、Check Box

文章目录 Qt3. Qt按钮类控件Push ButtonRadio ButtonCheck Box Qt 3. Qt按钮类控件 Push Button 使用 QPushButton 表示一个按钮。当点击按钮时可以触发各种事件。QPushButton 继承自 QAbstractButton。这个类是一个抽象类。是其他按钮的父类。 PushButton和QAbstractButton的…

阿里云linux系统扩容分区

系统扩容需要进行三步操作&#xff1a;①服务器扩容云盘 ② 扩容分区 ③ 扩容文件系统 参考&#xff1a;https://help.aliyun.com/zh/ecs/user-guide/extend-the-partitions-and-file-systems-of-disks-on-a-linux-instance?spma2c4g.11186623.0.0.6a094862DCMnnM#de3365e1d4l…

国内如何下载谷歌浏览器(chrome浏览器)历史版本和chromedriver驱动,长期更新,建议收藏

众所周知&#xff0c;google是一直被国内屏蔽的&#xff0c;有时候想要下载个chrome浏览器都要去外网&#xff0c;或者到处去搜索才能下载到。因为下载chrome浏览器的这个网址&#xff1a;google.com/chrome/ 在国内是一直被屏蔽掉的。 今天主要讲解的是国内ChromeDriver 的下…