题目:
一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间的距离是100m。每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,未照明区间的长度和。
输入描述:
第一行为一个数N,表示灯的个数,[1, 100000] 第二行为N个空格分隔的数,表示路灯的照明半径,[1,100*100000]
输出描述:
第一个路灯和最后一个路灯之间,未照明区间的长度和
举例:
输入:2 50 50 输出:0
输入:4 50 70 20 70 输出:20
输入:8 10 10 10 250 10 10 10 10 输出:160
实现思路
#include
#include
#include
using namespace std;
int main()
{
int n, r;
cin >> n;//路灯个数
vector<pair<int,int>> light;//每盏灯灯光所能照到的区间
vector<int> res(n - 1, 100);//保存每个空隙当前的最小阴影
int i = 0, N = n;
while (n--)
{
cin >> r;//输入每个半径
light.emplace_back(max(i * 100 - r, 0), min(i * 100 + r, (N - 1) * 100));
++i;
}
for (int i = 0; i < light.size() - 1; ++i)
{
for (int j = i + 1; j < light.size(); ++j)
{
if (light[i].second >= light[j].first)//部分区间全部能照射到,这些区间都更新为0
{
int tmp = j-1;
while (tmp >= i)
{
res[tmp] = 0;
tmp--;
}
}
else
{
int index1 = light[j].first / 100, index2 = light[i].second / 100;
if (index1 > index2)continue;//不在一个区间,没必要比较
res[index1] = min(res[index1],light[j].first - light[i].second);//在一个区间更新当前阴影
}
}
}
cout << accumulate(res.begin(), res.end(), 0);//求和
return 0;
}