1560. 圆形赛道上经过次数最多的扇区

1560. 圆形赛道上经过次数最多的扇区

已解答

简单

相关标签

相关企业

提示

给你一个整数 n 和一个整数数组 rounds 。有一条圆形赛道由 n 个扇区组成,扇区编号从 1 到 n 。现将在这条赛道上举办一场马拉松比赛,该马拉松全程由 m 个阶段组成。其中,第 i 个阶段将会从扇区 rounds[i - 1] 开始,到扇区 rounds[i] 结束。举例来说,第 1 阶段从 rounds[0] 开始,到 rounds[1] 结束。

请你以数组形式返回经过次数最多的那几个扇区,按扇区编号 升序 排列。

注意,赛道按扇区编号升序逆时针形成一个圆(请参见第一个示例)。

示例 1:

输入:n = 4, rounds = [1,3,1,2]
输出:[1,2]
解释:本场马拉松比赛从扇区 1 开始。经过各个扇区的次序如下所示:
1 --> 2 --> 3(阶段 1 结束)--> 4 --> 1(阶段 2 结束)--> 2(阶段 3 结束,即本场马拉松结束)
其中,扇区 1 和 2 都经过了两次,它们是经过次数最多的两个扇区。扇区 3 和 4 都只经过了一次。

示例 2:

输入:n = 2, rounds = [2,1,2,1,2,1,2,1,2]
输出:[2]

示例 3:

输入:n = 7, rounds = [1,3,5,7]
输出:[1,2,3,4,5,6,7]
class Solution {
public:
    vector<int> mostVisited(int n, vector<int>& rounds) {
        vector<int> res;
        int begin = rounds[0];
        int end = rounds[rounds.size() - 1];
        if (begin > end) {
            for (int i = 1; i <= end; i++) {
                res.push_back(i);
            }
            for (int i = begin; i <= n; i++) {
                res.push_back(i);
            }
        }
        else if (begin <= end) {
            for (int i = begin; i <= end; i++) {
                res.push_back(i);
            }
        }
        return res;
    }
};

提示:

  • 2 <= n <= 100
  • 1 <= m <= 100
  • rounds.length == m + 1
  • 1 <= rounds[i] <= n
  • rounds[i] != rounds[i + 1] ,其中 0 <= i < m

代码:

### 圆形赛道循迹小车的传感器算法与实现方案 #### 1. **圆形赛道循迹原理** 圆形赛道循迹的核心在于利用传感器检测赛道上的标记(通常是黑色线条或其他颜色对比明显的区域),并通过控制算法调整小车的方向,使其始终沿着预定路径行驶。常见的传感器包括红外循迹传感器和摄像头视觉识别系统。 对于红外循迹传感器而言,其工作基于反射光强度差异[^1]。当传感器检测到高反射率表面(如白色赛道)时返回较低值;而低反射率表面(如黑色线条)则返回较高值。通过多个传感器组合布置,可以更精确判断当前位置相对于目标轨迹的状态。 #### 2. **传感器布局设计** 为了适应圆形赛道的特点并提高循迹精度,通常会采用多路红外循迹传感器阵列而非简单的双通道配置。例如三路、五路甚至更多数量的传感器排列成直线形式安装于车辆底部中央前方一定距离处[^1]。这样的设置有助于覆盖更大的范围,在快速移动过程中也能及时捕捉方向变化信息。 #### 3. **PID 控制算法应用** 针对复杂环境下的稳定运行需求,推荐使用 PID (比例-积分-微分)控制器来优化舵机或者电机的速度调节过程。基本流程如下: - 单片机读取各路红外传感器 AD 值; - 计算实际测量值与期望设定值之间的偏差; - 结合 P(Proportional), I(Integral), D(Derivative) 参数计算得出最终输出用于修正方向或速度。 以下是简化版 PID 调节伪代码示例: ```c float error, last_error; float kp = 1.2; // 比例系数 float ki = 0.005; // 积分系数 float kd = 0.8; // 微分系数 int integral = 0; void pid_control(int target_value){ float output; error = target_value - current_sensor_value(); integral += error; derivative = error - last_error; output = kp * error + ki * integral + kd * derivative; adjust_motor(output); last_error = error; } ``` 此段代码展示了如何依据实时获取的数据运用标准公式完成自动校正动作[^1]。 #### 4. **硬件选型建议** 主控单元可以选择性能较强的 ARM Cortex-M 系列 MCU 如 STM32F103C8T6 ,它具备足够的运算能力支持复杂的数学模型以及丰富的外设接口便于扩展功能模块[^2] 。与此同时搭配高效能直流减速马达配合编码器反馈构成闭环控制系统进一步提升整体表现水平。 驱动芯片方面 L298N 是较为常见且易于操作的选择之一,可满足双向驱动两台小型电动机的要求同时兼容多种供电规格方便调试验证阶段灵活切换电源种类。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值