【华为OD机试真题 C语言】3、 路灯照明问题 | 机试真题+思路参考+代码解析

文章目录

    • 一、题目
      • 题目描述
      • 输入输出
      • 样例1
      • 样例2
    • 二、思路参考
    • 三、代码参考
      • C语言
  • 作者:KJ.JK


个人博客首页: KJ.JK
 
专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习

一、题目


题目描述

在一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间间距固定为100米。
每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。


输入输出

输入
在一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间间距固定为100米。
每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。
 
输出
第一个路灯和最后一个路灯之间,无法照明的区间的长度和


样例1

输入
4 
50 70 20 70

输出1
20

说明:
路灯1 覆盖0-50
路灯2 覆盖30-170
路灯3 覆盖180-220
路灯4 覆盖230-370

样例2

输入
2
50 50

输出1
0

说明:
路灯1覆盖0-50,路灯2覆盖50-100,路灯1和路灯2之间(0-100)无未覆盖的区间

二、思路参考

首先,根据输入的路灯个数N,以及照明半径数组,我们需要确定每个路灯的位置范围。
根据题目描述,路灯之间的间距固定为100米,所以可以计算出每个路灯的起始位置和终止位置。
然后,我们需要确定第一个路灯和最后一个路灯之间无法照明的区间。
如果第一个路灯的起始位置大于0,则第一个路灯前面的区间无法照明,长度为第一个路灯的起始位置。
如果最后一个路灯的终止位置小于100 * (N - 1),则最后一个路灯后面的区间无法照明,长度为100 * (N - 1) - 最后一个路灯的终止位置。
对于两个相邻的路灯i和i+1,如果路灯i+1的起始位置大于路灯i的终止位置,则这两个路灯之间存在无法照明的区间,长度为路灯i+1的起始位置减去路灯i的终止位置。
将以上计算得到的无法照明区间长度累加即可得到结果。


三、代码参考


C语言


#include 

int main() {
    int N;
    scanf("%d", &N);
    int radii[N];
    for (int i = 0; i < N; i++) {
        scanf("%d", &radii[i]);
    }

    int firstLampStart = 0;
    int lastLampEnd = 100 * (N - 1);
    int unlitInterval = 0;

    for (int i = 0; i < N; i++) {
        int lampStart = i * 100 - radii[i];
        int lampEnd = i * 100 + radii[i];
        if (i == 0 && lampStart > 0) {
            unlitInterval += lampStart;
        }
        if (i == N - 1 && lampEnd < lastLampEnd) {
            unlitInterval += lastLampEnd - lampEnd;
        }
        if (i > 0) {
            int prevLampEnd = (i - 1) * 100 + radii[i - 1];
            if (lampStart > prevLampEnd) {
                unlitInterval += lampStart - prevLampEnd;
            }
        }
    }

    printf("%d\n", unlitInterval);

    return 0;
}



作者:KJ.JK

你可能感兴趣的:(华为OD机试真题(C语言),c语言,开发语言,算法,路灯照明问题,华为od机试真题)