老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
输入描述
输入包括多组测试数据。 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M <
5000),分别代表学生的数目和操作的数目。 学生ID编号从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩
接下来又M行,每一行有一个字符C(只取‘Q’或‘U’),和两个正整数A,B,当C为’Q’的时候,
表示这是一条询问操作,他询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少
当C为‘U’的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
输出描述
对于每一次询问操作,在一行里面输出最高成绩。
分析及代码
在这道题中虽然意思一目了然,就是找一个区间内的最大值和更改某个下标的数值。但是其中还是有许多的小坑:
- 输入包含多组数据,说明有可能输入多组N,M进行操作
- 输入的A和B如果为找最大值操作,二者大小需比较才能确定空间的始末
- 题目中告诉你学生的编号是从1到N,数组中的下标是1到N-1
了解了这些坑,我们就来看一下具体代码吧!
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
// 注意题目的第一个坑,可能不止输入一个N,M
while(sc.hasNext()){
int N = sc.nextInt(); //学生的数目
int M = sc.nextInt(); //操作数目
int[] score = new int[N];
// 保存学生成绩
for(int i = 0; i < N; i++){
score[i] = sc.nextInt();
}
// 进行成绩的修改与查询操作
for(int i = 0; sc.hasNext() && i < M; i++){
// 在这里由于Scanner中没有nextChar操作,所以我先将这个当作字符串然后转为数组,因为它其中只有一个字符,所以我取了首字符
// 取这个操作字符的方法不唯一
char c = sc.next().toCharArray()[0];
int A = sc.nextInt();
int B = sc.nextInt();
// 进行操作
opeartor(score, c, A, B);
}
}
}
private static void opeartor(int[] score, char c, int a, int b) {
if(c == 'Q'){
// 可能出现所输入编号a,b不确定二者之间的大小
int begin = (a < b ? a : b) - 1;
// 考虑编号从1-N,但是数组下标从0-N-1
int end = a > b ? a : b;
int max = score[begin]; // 用于记录最大成绩
for(int i = begin; i < end; i++){
if(score[i] > max){
max = score[i];
}
}
System.out.println(max);
}
else if(c == 'U'){
score[a-1] = b;
}
}
}
牛客网上在线OJ运行结果为: