题解 P1531 【I Hate It】

· · 题解

这题找好方法是很简单的

不过遇上读入字符的时候尽量用cin,否则会发生命案(就像本人刚刚开始做的时候一样

题目的思路也比较清晰,处理时写个for循环,先判断第一个字符是Q还是U

如果是Q的话:

        if(c[i]=='Q')
        {
            int t=-2006;
            for(int j=a[i];j<=b[i];j++)//挨个检查
            {
                if(s[j]>t)//如果比t大
                {
                    t=s[j];
                }
            }
            cout<<t<<endl; //打印,换行
        }

t就随便取一个负值,再与区间内的数逐个比较,并实时更新最大值,最后打印

如果是U,就更新学生的分值

        else//接前面,如果不是Q就是U
        {
            if(s[a[i]]<b[i])//简单判断一下
            {
                s[a[i]]=b[i];
            }
        }

下面附上AC代码:

#include <bits/stdc++.h>//万能头
using namespace std;
int a[5005],b[5005],s[200005];//a和b表示输入指令内容,s表示成绩
char c[5005]; //指令类型
int n,m;
int main()
{
    cin>>n>>m;//输入n,m
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];//输入学生成绩
    }
    for(int i=1;i<=m;i++)
    {
        cin>>c[i]>>a[i]>>b[i];//输入每一条指令
    }
    //前面都是读入,下面是重点
    for(int i=1;i<=m;i++)//枚举每一条指令的for循环
    {
        //前面已经给出此处思路所以不再重复
        if(c[i]=='Q')//如果是Q
        {
            int t=-2006;//随便起哪一个负值都可以
            for(int j=a[i];j<=b[i];j++)//比较判断大小的for循环
            {
                if(s[j]>t)
                {
                    t=s[j];
                }
            }
            cout<<t<<endl;//打印,记得换行,注意格式
        }
        else//如果是U
        {
            //同样前面已经给出思路不再重复
            if(s[a[i]]<b[i])
            {
                s[a[i]]=b[i];
            }
        }
    }
    return 0;//完美的结束
}

来个赞呗,深夜辛辛苦苦写的