输入排序字母做判据

输入包括多组测试数据。
每组输入第一行是两个正整数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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无情的搬砖机器

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值