A1037 Magic Coupon (25分)

思路是将正数和负数分开求解,如下:

1. 对正数部分求乘积:i, j 从头开始遍历,当二者之一遇到负数就退出

2. 记录第一个负数出现的位置,然后 i, j 改为两数组最后一个元素

    因为负数是绝对值大的排序排在后面,求乘积先取大的,所以从后往前遍历:

3. 对负数部分求乘积,原理同1

 

 

伪码如下:

/* 伪码 */
//1. 读入 coupons 和 products,并排序,略

//2. 对正数进行计算
int i = 0, j = 0;
while () {
if (i 和 j 都是正数) 累加乘积
else break;
}

//3. 记录第一个负数出现的位置
while (i 从当前位置开始往后遍历 coupons 为正数) ++i;
while (j 从当前位置开始往后遍历 products 为正数) ++j;
记录此时的i, j; 然后i, j均指向最后一个两数组最后一个元素

//4. 对负数进行计算
while () {
if (i 和 j 都是负数) 累加乘积
else if (i, j 到了上次记录的位置) break;
}

 代码地址

posted @ 2021-01-17 16:22  幼麟  阅读(81)  评论(0编辑  收藏  举报