CF1310A Recommendations

题目描述:
https://codeforces.com/problemset/problem/1310/A
给你两个数组 a 和 t,长度相同且不超过 2e5,1<=a[i]<=1e9, 1<=t[i]<=1e5。
每次操作,你可以给某个 a[i]+=1,花费为 t[i]。你可以操作任意多次。
请问要使 a 中所有数字均不相同,最小花费是多少?

题解

  1. // 核心代码gou'zao
  2. static void solve() {
  3. int n = ni();
  4. int[][] a = new int[n][2];
  5. for (int i = 0; i < n; i++) {
  6. a[i][0] = ni();
  7. }
  8. for (int i = 0; i < n; i++) {
  9. a[i][1] = ni();
  10. }
  11. PriorityQueue<Integer> q = new PriorityQueue<>((o1, o2) -> o2 - o1);
  12. Arrays.sort(a, (o1, o2) -> (o1[0] - o2[0]));
  13. long sum = 0, t = 0;
  14. long cur = 0;
  15. for (int i = 0; i < n || !q.isEmpty(); i++) {
  16. if (q.isEmpty()) cur = a[i][0];
  17. int j = i;
  18. while (j < n && a[j][0] == cur) {
  19. q.offer(a[j][1]);
  20. t += a[j][1];
  21. j++;
  22. }
  23. i = j - 1;
  24. cur++;
  25. t -= q.poll();
  26. sum += t;
  27. }
  28. out.println(sum);
  29. }