华为2016校园招聘上机笔试题----最高分是多少

时间:2021-11-13 18:52:42
[编程题] 最高分是多少 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩. 
输入描述:
输入包括多组测试数据。
每组输入第一行是两个正整数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。


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

输入例子:
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,不止输入一组n m ;2,AB之间,可能A>B
#include <vector>
#include <iostream>
using namespace::std ;

int main() {
int n, m ;
float score ;
char c ;
int a, b ;

while ( cin >> n >> m ) {
if ( n <= 0 || n >30000 || m <= 0 || m > 5000 ) return 0 ;
vector<float> vec( n + 1, 0.0 ) ;
for ( int i = 1; i <= n; ++ i ) {
cin >> score ;
vec[i] = score ;
}
for ( int i = 0; i < m; ++ i ) {
cin >> c >> a >> b ;
if ( c == 'Q' ) {
if ( a > b ) {
int tmp = a ;
a = b ;
b = tmp ;
}
float max = vec[a] ;
for ( int i = a; i <= b; ++ i ) {
if ( max < vec[i] ) max = vec[i] ;
}
cout << max << endl ;
} else if ( c == 'U' ) {
vec[a] = b ;
}
}
}
return 0 ;
}


第二次做,还是要注意坑人之处:
此题坑人的地方有两处:1,不止输入一组n m ;2,AB之间,可能A>B
#include <vector>
#include <iostream>

using namespace::std ;

int main() {
int n, m ;

while ( cin >> n >> m ) {
vector<int> vec ;
vector<int> result ;
for ( int i = 0; i < n; ++ i ) {
int tmp ;
cin >> tmp ;
vec.push_back( tmp ) ;
}

for ( int i = 0; i < m; ++ i ) {
char opt ;
int a, b ;
cin >> opt >> a >> b ;
if ( opt == 'Q' ) {
if ( a > b ) {
int tmp = a ;
a = b ;
b = tmp ;
}
int max = -1 ;
for ( int i = a - 1; i < b; ++ i ) {
if ( vec[i] > max ) max = vec[i] ;
}
result.push_back( max ) ;
} else if ( opt == 'U' ) {
vec[a - 1] = b ;
}
}

for ( int i = 0; i < result.size(); ++ i ) {
cout << result[i] << endl ;
}
}
return 0 ;
}