输入包括多组测试数据。 每组输入第一行是两个正整数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。
思路:因为每行的输入有一个字符和两个数字,并且需要通过字符来确定实现那个操作,首先想到的就是创建对象数组将输入的每一行存放起来,然后遍历寻找再判断即可
#include<iostream>
#include<vector>
using namespace std;
class M {
char c;
int a, b;
public:
M() {
cin >> c>>a>>b;
}
char get_c() {
return c;
}
int get_a() {
return a;
}
int get_b() {
return b;
}
};
int get_max(int a, int b) {
return a > b ? a : b;
}
int find_max(int arr[],int begin, int end) {
if (begin <= end) {
int max = arr[begin];
for (int i = begin; i <= end; i++) {
max = get_max(max, arr[i]);
}
return max;
}
else {
int max = arr[end];
for (int i = end; i <= begin; i++) {
max = get_max(max, arr[i]);
}
return max;
}
}
int main() {
int n, m;//n表示学生个数,m表示操作个数
while (cin >> n >> m) {
int* p = new int[n];//创建动态数组存放元素
for (int i = 0; i < n; i++) {
cin >> p[i];
}
M** ptr = new M* [m];//创建动态对象数组好吧,数组存放的是指向对象的指针
for (int i = 0; i < m; i++) {
ptr[i] = new M;//然后将动态创建的M对象的地址放进数组ptr
}
vector<int>v;
for (int i = 0; i < m; i++) {
if (ptr[i]->get_c()=='Q') {
//减一是因为学生的序号从1-N,数组中是0到n-1
int temp = find_max(p,ptr[i]->get_a()-1, ptr[i]->get_b()-1);
v.push_back(temp);
}
else{
//注意减一
p[ptr[i]->get_a()-1] = ptr[i]->get_b();
}
}
for (int i = 0; i < v.size(); i++) {
cout << v[i] << endl;
}
delete []ptr;
}
}