2022华为机试真题 C++ 实现补种未成活胡杨

Posted MISAYAONE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022华为机试真题 C++ 实现补种未成活胡杨相关的知识,希望对你有一定的参考价值。

目录

题目

思路

考点

Code


题目

补种未成活胡杨

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

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

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

输入描述

N 总种植数量

M 未成活胡杨数量

M 个空格分隔的数,按编号从小到大排列

K 最多可以补种的数量

其中:

1 <= N <= 100000

1 <= M <= N

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:拿到题先在纸上画一画,对于示例来说,只有 1、3、5 号三棵树成活了,只能补种 1 棵树,那么补种到2或4结果一样,最多的连续胡杨棵树都是3。理解了题目逻辑之后,就好办了。

2:明显可以使用经典的滑动窗口法,设定好左边界和右边界,并且保证中间有K棵树可以补种,求左边界和右边界的最大差值即可。

3:需要注意不能新种,只能补种,意味着K 个树苗,只能放置在未存活树苗的位置上

考点

1:滑动窗口法

2:题意理解

Code

// Online C++ compiler to run C++ program online
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
using namespace std;

int main() 
    int N;
    int M;
    cin >> N >> M;
    
    // 未存活树的坐标
    vector<int> dead_pos ;
    while (M) 
        M--;
        int pos;
        cin >> pos;
        dead_pos.push_back(pos);
    
    
    // 补种树的个数
    int K;
    cin >> K;
    
    int max_length = 0;
    // 树只能补种,不能新种,所以用未存活的个数减去可以补树的个数来确定最多可以补种多少棵树
    // i 表示当前已经补种了多少棵树
    for (int i=0; i<=dead_pos.size() - K; i++) 
        // 左边界和右边界
        int left = 0;
        int right = N;
        
        // 若已经补种了树苗,则将补种的位置更新为左边界
        if (i > 0) 
            left = dead_pos[i - 1];
        
        // 更新右边界,注意不能超出最大的补种范围
        if (i + K < dead_pos.size()) 
            right = dead_pos[i + K] - 1;
        

        int temp = right - left;
        if (temp > max_length) 
            max_length = temp;
        
    
    cout << max_length << endl;
    return 0;

以上是关于2022华为机试真题 C++ 实现补种未成活胡杨的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试真题 C++ 实现优秀学员统计2022.11 Q4 新题

华为OD机试真题 C++ 实现士兵过河2022.11 Q4 新题

2022华为机试真题 C++ 实现数大雁

华为OD机试真题 C++ 实现硬件产品销售方案2022.11 Q4 新题

2022华为机试真题 C++ 实现快递运输

2022华为机试真题 C++ 实现快速人名查找