1 题目
2 代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
public class A1037 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int nC = Integer.valueOf(br.readLine());
String[] oneLine = br.readLine().split(" ");
int nP = Integer.valueOf(br.readLine());
String[] twoLine = br.readLine().split(" ");
Integer[] coupon = new Integer[nC];
Integer[] products = new Integer[nP];
for (int i = 0; i < nC; i++) {
coupon[i] = Integer.valueOf(oneLine[i]);
}
for (int i = 0; i < nP; i++) {
products[i] = Integer.valueOf(twoLine[i]);
}
// 按照数字大小进行排序,注意负数之间通过绝对值进行比较
Arrays.sort(coupon, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 < 0 && o2 < 0)
return Math.abs(o2) - Math.abs(o1);
else
return o2 - o1;
}
});
Arrays.sort(products, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 < 0 && o2 < 0)
return Math.abs(o2) - Math.abs(o1);
else
return o2 - o1;
}
});
// 记录总回报
int money = 0;
// 双指针分别指向优惠券数组和产品数组,重头到尾扫描,正数*正数,负数*负数,遇0跳过
for (int i = 0, j = 0; i < coupon.length && j < products.length; ) {
if (coupon[i] == 0) {
i++;
continue;
}
if (products[j] == 0) {
j++;
continue;
}
if (coupon[i] > 0 && products[j] > 0) {
money += (coupon[i] * products[j]);
i++;
j++;
} else if (coupon[i] > 0 && products[j] < 0) {
i++;
} else if (coupon[i] < 0 && products[j] > 0) {
j++;
} else if (coupon[i] < 0 && products[j] < 0) {
money += (coupon[i] * products[j]);
i++;
j++;
}
}
System.out.println(money);
}
}
3 要点
(1)贪心思想,从大到小排序后,按照正数*正数,负数*负数的方式进行,后续采用双指针,然而有个测试点一过不去。
(2)看了些网上大佬的题解,都是将正负数分开处理的。