路灯照明问题 | 时间限制: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代表路灯右边。