小红书8.28题解
1. 排队(封装‘大臣’对象,加入到优先级队列即可)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 大臣数量
int n = scanner.nextInt();
// 重要性方面数量
int m = scanner.nextInt();
// 需要帮忙的大臣序号
int id = scanner.nextInt();
int[][] arr = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr[i][j] = scanner.nextInt();
}
}
TreeSet<Minister> set = new TreeSet<>((m1, m2) -> m1.sum != m2.sum ? m2.sum - m1.sum : m1.id - m2.id);
for (int i = 0; i < n; i++) {
Minister minister = new Minister();
minister.id = i + 1;
for (int j = 0; j < m; j++) {
minister.sum += arr[i][j];
}
set.add(minister);
}
int ans = 1;
for (Minister minister : set) {
if (minister.id == id) {
break;
} else {
ans++;
}
}
System.out.println(ans);
}
public static class Minister {
// id序号
private int id;
// 分数总和
private int sum;
public Minister() {
}
}
2. 法术(排序+倒序二分)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 小明会的法术数量
int n = scanner.nextInt();
// 最低达到的威力
long K = scanner.nextLong();
// 第i种法术对应的威力值
long[] arr = new long[n];
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
long ans = process(K, arr);
System.out.println(ans);
}
// 排序,倒序二分最后乘以二
public static long process(long K, long[] arr) {
// 题意是只要左右手不使用同一种魔法就行,魔法威力一样的也可以释放。
Arrays.sort(arr);
long ans = 0;
int N = arr.length;
int L = 0;
int R = N - 1;
while (L < R) {
if (arr[R] * arr[L] >= K) {
ans += R - L;
R--;
} else {
L++;
}
}
return ans * 2;
}
}
3. 一对一(从出度最小的点开始构建朋友,找到就标记,然后从出度第二小出发....)
这一题的测试用例自己不好生成,就测试了几个用例。如果不对,请大家斧正。