刷题笔记:牛客华为2016机试——最高分是多少

题目

老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.
输入描述:

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

输出描述:
对于每一次询问操作,在一行里面输出最高成绩.

示例1
输入

5 7
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 4 5
U 2 9
Q 1 5

输出

5
6
5
9

思路

两种处理:1.查询,2.更新。

1.查询:在数组指定区间内找最大值,注意测试用例中,输入的两个ID A可能大于B,需要处理。
2.更新:找到对应的ID该成绩即可。

代码

#include <iostream> 
#include <vector>
#include <algorithm>
#include <string>

using namespace std; 
int main()
{
    int N;  //学生ID
    int M;  //操作数
    while(cin>>N>>M)
    {
        vector<int> scores;
        for(int i=0;i<N;i++)
        {
            int score;
            cin>>score;
            scores.push_back(score);
        }
        for(int i=0;i<M;i++)
        {
            char operation;
            cin>>operation;
            if(operation=='Q')
            {
                int min,max;
                int scores_max=0;
                cin>>min>>max;
                if(min>max)
                {
                    int temp=min;
                    min=max;
                    max=temp;
                }
                for(int i=min-1;i<max;i++)
                {
                    if(scores_max<scores[i])
                    {
                        scores_max=scores[i];
                    }
                }
                cout<<scores_max<<endl;
            }
            else if(operation=='U')
            {
                int id,scores_new;
                cin>>id>>scores_new;
                scores[id-1]=scores_new;
            }
        }

    }
}

猜你喜欢

转载自blog.csdn.net/lin453701006/article/details/80636675