题解 P1531 【I Hate It】
Talanton_Cerydra · · 题解
这题找好方法是很简单的
不过遇上读入字符的时候尽量用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;//完美的结束
}