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

/*题目:
一条笔直的公路上安装了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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值