题目:
新来的老师给班里的同学排一个队,每个学生有一个能力值。
一些学生是刺头,不会听老师的话,自己选位置;
非刺头同学在剩下的位置按照能力值从小到大排。
对于非刺头同学,如果发现他前面有比自己高的同学,他不满程度就增加,增加的数量等于前面能力值比他大的同学的个数。
刺头不会产生不满。
如果整个班级累计的不满程度超过 ( k ),那么老师就没有办法教这个班级了。
输入描述:
shell
输入有三行:
第一行为 ( n, m, k ) 空格隔开,分别表示班级总人数、刺头人数、最大不满程度 ( k )。
第二行为刺头所在位置(从 0 开始,即排队数组的下标,比如 1 代表队伍中第 2 个同学是刺头),位置的数组也是排序的。
第三行有 ( n ) 个数,空格隔开,表示老师排好的队中每个人的能力值,其中非刺头同学一定按照能力值从小到大排好序的。
输出描述:
shell
0 表示老师可以继续教这个班级;
1 表示老师无法继续教这个班级。
说明:
shell
( n ) 范围是 [1, 100000]
( m ) 范围是 [1, ( n )]
( k ) 范围是 [1, 1000000000]
每位同学的能力值范围是 [1000, 100000]
示例一:
输入
4 2 3
1 3
1810 1809 1801 1802
输出
1
先看结果 :
通过以下步骤来实现:
-
读取输入:
- 第一行读取
n
,m
,k
。 - 第二行读取刺头学生的位置。
- 第三行读取所有学生的能力值。
- 第一行读取
-
处理数据:
- 将刺头学生的位置标记为特殊值(例如
-1
)。 - 计算每个非刺头学生的不满程度,并累加到总不满程度中。
- 将刺头学生的位置标记为特殊值(例如
-
判断结果:
- 如果总不满程度超过
k
,输出1
。 - 否则,输出
0
。
- 如果总不满程度超过
下面是一个具体的Java代码实现:
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入
// 班级总人数
int n = scanner.nextInt();
// 刺头总人数
int m = scanner.nextInt();
// 最大不满程度
long k = scanner.nextLong();
int[] positions = new int[n];
for (int i = 0; i < m; i++) {
// 刺头所在位置
positions[scanner.nextInt()] = -1;
}
long[] values = new long[n];
for (int i = 0; i < n; i++) {
values[i] = scanner.nextLong();
}
// 计算不满
long totalDissatisfaction = 0;
for (int i = 0; i < n; i++) {
// 跳过刺头
if (positions[i] == -1) continue;
int count = 0;
for (int j = 0; j < i; j++) {
if (values[j] > values[i]) {
count++;
}
}
totalDissatisfaction += count;
}
// 输出结果
if (totalDissatisfaction > k) {
System.out.println(1);
} else {
System.out.println(0);
}
}
}