题目描述:
老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.
输入描述:
每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目。
学生ID编号从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩
接下来又M行,每一行有一个字符C(只取‘Q’或‘U’),和两个正整数A,B,当C为'Q'的时候, 表示这是一条询问操作,假设A<B,他询问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
输出例子1:
5 6 5 9
输入例子2:
3 2 1 2 3 U 2 8 Q 3 1
输出例子2:
8
对于每一次询问操作,在一行里面输出最高成绩.
c代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void swap(int*a,int*b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
int main()
{
int n,m;
int i,j;
int s1,s2;
int temp;
int a[30000];
char ch;
while(scanf("%d%d",&n, EOF) {
for(i=1;i<=n;i++) {
scanf("%d", //录入每个学生的成绩
}
for(i=0;i<m;i++) {
scanf(" %c%d%d",&ch,
if(ch == 'U') {
a[s1] = s2;
}
else if(ch == 'Q') {
if(s1>s2) {
swap(
}
temp = a[s1];
for(j=s1+1;j<=s2;j++) {
if(temp<a[j])
temp = a[j];
}
printf("%d\n",temp);
}
}
}
}
一道看似很简单的题目;竟然花了很久很久的时间才把全部测试用例通过;无语,很无语....
记录一下自己踩的大坑,不过通过这道题目还是学到了一些东西,其实是蛮好的题。
题目的思路:
1、首先读入学生数量n和操作数m
2、用一个数组记录每个学生的成绩a[i]
3、根据学生数量n,循环读入每个学生的成绩
4、根据操作数m的数量,循环对相应的操作进行对应处理即可:
1>若是U,则直接将相应数组位置的值改为期待的值
2>若是Q,则将指定区间数组的最大值取出来输出
踩坑点:
1、若输入Q,取出指定区间的最大值;第一个输入值是可能比第二个大的;
所以我们要进行判断,对应的代码处理段:
if(s1>s2) {
swap(
}
2、scanf的运用问题;
先看如下代码段:
scanf(" %c%d%d",&ch,&s1,&s2);
可以发现scanf(" %c%d%d",&ch,&s1,&s2);%c前面是有空格的!一开始写程序的时候没有加,在本地调试的时候就发现输出一直有问题,本地运行如下:
可以看到 输入U 2 8后就直接结束了;原因如下:
采用%c的时候,是会读取所有字符的;我们在输入每个学生的成绩时,最后一个换行符是还在缓冲区中的;紧接着我们进行scanf("%c");进行读取,读到的就是在缓冲区里的'\n',这样就发生了错误;
解决的方法有两种:
<1>、scanf(" %c%d%d",&ch,&s1,&s2);
%c前加上一个空格;百度到了这样一个解释觉得蛮不错:
控制串、数组钟的空白符使scanf()在输入留中跳过一个或多个空白符(本地试了一下,确实可以跳过多个);空白符可以是空格、制表符(tab)和新行符(newline)。本质上,控制串中的空白符使scanf(),在输入流中读,但不保存结果,直到发现非空白字符为止;
ps:
C标准中空白字符有:空格(‘ ’)、换页(‘\f’)、换行(‘\n’)、回车(‘\r’)、水平制表符(‘\t’)、垂直制表符(‘\v’)六个
<2>、getchar()
getchar();
scanf("%c%d%d",&ch,
使用getchar()吃掉换行符,用例也是可以通过的;这个就不用多解释了
3、这道题是可以有多组输入的!
其实在题目中的注意里提到了....所以仔细读题是非常重要的
所以一开始的数据读入要这样写
while(scanf("%d%d",&n,&m) != EOF) {
总结:题目其实很简单,但是要注意的小细节点挺多