牛客网题目:路灯照明问题(C语言)

路灯照明问题 | 时间限制:1 秒 | 内存限制:262144K | 语言限制:不限
在一条笔直的公路上安装了 N 个路灯,从位置 0 开始安装,路灯之间间距固定为 100 米。
每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的
长度和。
输入描述:
第一行为一个数 N,表示路灯个数,1<=N<=100000
第二行为 N 个空格分隔的数,表示路径的照明半径,1<=照明半径<=100000*100
输出描述:
第一个路灯和最后一个路灯之间,无法照明的区间的长度和
示例 1
输入
2
50 50
输出
0
说明
路灯 1 覆盖 0-50,路灯 2 覆盖 50-100,路灯 1 和路灯 2 之间(0 米-100 米)无未覆盖的区间
示例 2
输入
4
50 70 20 70输出
20
说明
[170,180],[220,230],两个未覆盖的区间,总里程为 20

示例3(本人所加的一个极端例子)

输入

4

210 50 20 70

输出

10

说明

第一个路灯直接覆盖到了第三个路灯右边的10米,然后第三个路灯自己发光半径为20,第四个路灯又从右边覆盖到第三个路灯右边的20米处,即中间的10米没有覆盖到,即区间[220,230]。

代码如下:

*****************************************代码分界线*****************************************

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include <stdio.h>
#include<math.h>
void main()
{
    int light[1000];
    int k,i,sum=0,i1,flagr1[1000],flagr2[1000],flagl1[1000],flagl2[1000];/*r表示右侧射过来的光线,l表示左侧射过来的光线,1表示路灯
    左边的区域,2表示右边的区域*/
    for (i = 0; i < 1000; i++)
    {
        flagr1[i] = 0;
        flagr2[i] = 0;
        flagl1[i] = 0;
        flagl2[i] = 0;
    }
    int j,sum2;
    scanf("%d", &k);
    for (i = 0; i < k; i++)
    {
        scanf("%d", &light[i]);
    }
    for (i = 0; i < k - 1; i++)
    {
        if (light[i] <= 50)
        {
            if (light[i] > flagr2[i])
            {
                flagr2[i] = light[i];
            }
        }
        else
        {
            flagr2[i] = 50;
            sum2 = light[i];
            sum2 = sum2 - 50;
            j = i;
            while (sum2 > 0 && j < k)
            {
                j++;
                if (sum2 < 50)
                {
                    if (sum2 > flagr1[j])
                    {
                        flagr1[j] = sum2;
                        sum2 = sum2 - 50;
                    }
                }
                else
                {
                    flagr1[j] = 50;
                    sum2 = sum2 - 50;
                }
                if (sum2 < 50)
                {
                    if (sum2 > flagr2[j])
                    {
                        flagr2[j] = sum2;
                        sum2 = sum2 - 50;
                    }
                }
                else
                {
                    flagr2[j] = 50;
                    sum2 = sum2 - 50;
                }
            }
        }
    }
    for (i = k-1; i >0; i--)
    {
        if (light[i] <= 50)
        {
            if (light[i] > flagl1[i])
            {
                flagl1[i] = light[i];
            }
        }
        else
        {
            flagl1[i] = 50;
            sum2 = light[i];
            sum2 = sum2 - 50;
            j = i;
            while (sum2 > 0 && j > -1)
            {
                j--;
                if (sum2 < 50)
                {
                    if (sum2 > flagl2[j])
                    {
                        flagl2[j] = sum2;
                        sum2 = sum2 - 50;
                    }
                }
                else
                {
                    flagl2[j] = 50;
                    sum2 = sum2 - 50;
                }
                if (sum2 < 50)
                {
                    if (sum2 > flagl1[j])
                    {
                        flagl1[j] = sum2;
                        sum2 = sum2 - 50;
                    }
                }
                else
                {
                    flagl1[j] = 50;
                    sum2 = sum2 - 50;
                }
            }
        }
    }
    for (i = 0; i < k; i++)
    {
        flagl1[i] = flagl1[i] + flagr1[i];
        if (flagl1[i] > 50)
            flagl1[i] = 50;
        flagl2[i] = flagl2[i] + flagr2[i];
        if (flagl2[i] > 50)
            flagl2[i] = 50;
    }
    sum = (k - 1) * 100;
    for (i = 0; i < k; i++)
    {
        sum = sum - flagl1[i];
        sum = sum - flagl2[i];
    }
    printf("%d", sum);
}

*****************************************代码分界线*****************************************

本代码用了四个数组存储发光覆盖区域,r代表从右边射过来的光,l代表从左边射过来的光,1代表路灯左边,2代表路灯右边。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值