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;
}