/*题目:
一条笔直的公路上安装了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*/
// 思路应该没问题,代码有点问题,未完待续。。。。。。。。
int get_ludeng_shade()
{
int N = 0;
cin >> N;
int LEN = 100;
vector<int> vec;
stack<pair<int,int> > shade;
for (int i = 0; i < N; ++i) {
int n = 0;
cin >> n;
vec.push_back(n);
}
int shaderight = (N - 1) * LEN;
int shadeleft = 0;
shade.push(make_pair(shadeleft, shaderight));
for (int i = 0; i < N - 1; ++i) {
int lightleft = ((i) * LEN - vec[i + 1]) > 0 ? ((i)* LEN - vec[i + 1]) : 0;
int lightright = (i) * LEN + vec[i + 1];
stack<pair<int, int> > shadetemp;
while(!shade.empty()) {
auto temp = shade.top();
shade.pop();
if (temp.second > lightright && temp.first < lightleft) {// 光覆盖部分阴影
shadetemp.push(make_pair(temp.first, lightleft));
shadetemp.push(make_pair(lightright, temp.second));
} else if(temp.first < lightright && temp.first >= lightleft){// 光覆盖全部阴影
shadetemp.push(make_pair(lightright, temp.second));
} else if(temp.second < lightright && temp.first <= lightleft){
shadetemp.push(make_pair(temp.first, lightleft));
} else {
shadetemp.push(temp);
}
}
if (!shadetemp.empty()) {
shade = shadetemp;
}
}
int sum = 0;
while(!shade.empty()) {
auto t = shade.top();
sum += (t.second - t.first);
shade.pop();
}
cout << sum << endl;
return sum;
}