9.11流利说笔试第一题礼物派发求讨论
思路:先求出甲乙两地给第i名用户寄礼物的费用的差值的绝对值,然后对差值做一个排序。下一步,要往list里存入差值排序前的角标,为了避免差值一样的情况时存入同样的角标,所以我设置了标志位,存入过list的角标不会再次存入。(我这里用的方法好笨,又遍历了一遍找出的角标,可以不可以对差值的绝对值排序的时候把角标也存进去阿?)。最后,比较甲乙两地费用的大小,取小的加入到最终的结果count中。题中给出的是a+b>=n,,,count做n次加法就可以跳出了,如果a或者b提前到了0,那么剩下的全从另一地取了,加continue是为了避免多运行下面的if语句。最后的for循环里,保证每次循环只对count做一次加法。
当时做的时候,觉得存角标太傻了,没继续写下去,再加上时间赶,就没写出来/。所以目前写的这个不知道能ac多少,用例可以过。
import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); //需要寄礼物的用户数 int n = sc.nextInt(); //a表示甲仓库存放的礼物数量,b表示乙仓库存放的礼物数量 int a = sc.nextInt(); int b = sc.nextInt(); //从甲地给第i名用户寄礼物的费用 int[] c = new int[n]; //从乙地给第i名用户寄礼物的费用 int[] d = new int[n]; for(int i = 0;i < n;i++){ c[i] = sc.nextInt(); d[i] = sc.nextInt(); } int[] cha = new int[n]; for(int i=0;i < n;i++){ cha[i] = Math.abs(c[i] - d[i]); } //对差值进行排序 Arrays.sort(cha); //存储差值对应的角标 ArrayList<Integer> list = new ArrayList<>(); boolean[] flag = new boolean[n]; for(int i = n-1;i >=0;i--){ for(int j=0;j < n ;j++){ if(flag[j] == true){ continue; } if(Math.abs(c[j] - d[j]) == cha[i]){ list.add(j); flag[j] = true; break; } } } //结果值 int count = 0; for(int i = 0;i < n;i++){ if(a == 0){ count += d[list.get(i)]; b--; continue; } if(b == 0){ count += c[list.get(i)]; a--; continue; } if(c[list.get(i)] < d[list.get(i)]){ count += c[list.get(i)]; a--; }else{ count += d[list.get(i)]; b--; } } System.out.println(count); } }