算法习题1

  • Q:一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间的距离是100m。每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,未照明区间的长度和。
  • 输入描述:
    • 第一行为一个数N,表示灯的个数,[1, 100000]
    • 第二行为N个空格分隔的数,表示路灯的照明半径,[1, 100*100000]
  • 输出描述:
    • 第一个路灯和最后一个路灯之间,未照明区间的长度和
  • A:
     #include <iostream>
     
     // 思路:计算任意两个之间的未照明距离,分别计算左A和右B所有的照明叠加,即计算A,A-1,A-2... 在此段距离的照明半径叠加。
     
     int getShadowLength(int lightNum, int * lightRadium){
     
         int length = 0;
     
         size_t index = 0;
         while (index < lightNum -1 ) {
             bool jump =false;
     
             //计算 r 和 r+1 之间的阴影距离
             if (lightRadium[index] + lightRadium[index + 1] >= 100){//全部照明
                 index++;
                 continue;
             }
     
             int leftLightlen = lightRadium[index];
             int rightLightlen = lightRadium[index + 1];
     
             int index_l = index - 1;
             while (index_l >= 0) {
                 if (lightRadium[index_l] <= 100) {
                     index_l--;
                     continue;
                 }
     
                 int n = lightRadium[index_l] % 100;
                 if (n >= index - index_l) {
                     if (n >= index - index_l + 1) {
                         index += n - (index - index_l);//跳出左循环循环,进入跳步循环
                         jump = true;
                         break;
                     }
     
                     int l = lightRadium[index_l] - 100*(index - index_l);
                     if (l > leftLightlen){
                         leftLightlen = l;
                     }
                 }
             }//左循环
             if (jump){
                 continue;
             }
     
             if (leftLightlen + lightRadium[index + 1] >= 100){//全部照明
                 index++;
                 continue;
             }
     
             int index_r = index + 2;
             while (index_r < lightNum) { // r+1 后起 r+2 ->> 最后一个
                 if (lightRadium[index_r] <= 100) {
                     index_r++;
                     continue;
                 }
     
                 int n = lightRadium[index_r] % 100;
                 if (n >= index_r - (index+1)) {
                     if (n >= index_r - (index+1) + 1) {
                         index += 2*n;//跳出左循环循环,进入跳步循环
                         jump = true;
                         break;
                     }
     
                     int r = lightRadium[index_r] - 100*(index_r - (index+1));
                     if (r > rightLightlen){
                         rightLightlen = r;
                     }
                 }
     
             }//右循环
             
             if (jump) {
                 continue;
             }
             
     
             if (leftLightlen + rightLightlen >= 100){
                 index ++;
                 continue;
             }
     
             length += 100 - leftLightlen - rightLightlen;
             index++;
         }//主循环
     
         return length;
     }
     
     int main(int argc, char* argv[]){
     
         int a[4] = { 50, 30, 150, 60};
     
         int x =  getShadowLength(4, a);
     
         std::cout << "lenth = " << x << std::endl;
     
         return 0;
     }
    
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值