P1678 烦恼的高考志愿java
时间: 2023-11-12 21:59:05 浏览: 47
这是一道算法题,需要使用贪心算法来解决。具体思路是先将所有学校按照录取分数线从高到低排序,然后从高到低依次填报志愿,直到填满为止。如果当前学校的录取分数线高于当前考生的分数,则跳过该学校,继续向下填报。如果所有学校都无法填报,则输出 "Impossible"。
Java代码实现如下:
```java
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 k = scanner.nextInt(); // 每个考生填报的志愿数
List<Integer>[] schools = new List[m + 1];
for (int i = 1; i <= m; i++) {
schools[i] = new ArrayList<>();
schools[i].add(scanner.nextInt()); // 录取分数线
schools[i].add(i); // 学校编号
}
int[] choices = new int[n + 1]; // 记录每个考生填报的志愿
for (int i = 1; i <= n; i++) {
int score = scanner.nextInt();
for (int j = 1; j <= k; j++) {
int choice = scanner.nextInt();
if (schools[choice].get(0) > score) { // 录取分数线高于考生分数,跳过该学校
continue;
}
choices[i] = choice;
schools[choice].add(i); // 将考生加入该学校的候选名单中
break;
}
}
for (int i = 1; i <= m; i++) {
Collections.sort(schools[i], Collections.reverseOrder()); // 将每个学校的候选名单按照分数从高到低排序
schools[i].remove(0); // 删除录取分数线
for (int j = 0; j < schools[i].size(); j++) {
System.out.print(schools[i].get(j) + " ");
}
System.out.println();
}
scanner.close();
}
}
```