题目(摘自牛客网华为机试):
老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.
输入描述:
输入包括多组测试数据。 每组输入第一行是两个正整数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.链表(稍复杂,不推荐)
<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node;
int GetMax(node *&head,int A,int B);
int UpdateScore(node *&head,int A,int B);
//获得最大值
int GetMax(node *&head,int A,int B)
{
if (A>B)
return -1;
int tmp=B-A+1;
int max,i;
if (head->next)
{
node *p=head;
int i=0;
while(i<A&&p)
{
p=p->next;
i++;
}
max=p->data;
for (i=0;i<tmp-1;i++)
{
p=p->next;
if (p->data>max)
{
max=p->data;
}
}
return max;
}
return -1;
}
//更新分数
int UpdateScore(node *&head,int A,int B)
{
int i=0;
node* p=head;
while(i<A&&p)
{
p=p->next;
i++;
}
if (i>A+1||!p)
{
return -1;
}
p->data=B;
return 1;
}
int main()
{
int n,m,tmp,max;
int A,B;
char v_cTemp;
int i;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n>30000||n<=0)
return -1;
if(m>5000||m<=0)
return -1;
node *head,*pre,*pcur;
head=(node *)malloc(sizeof(struct node));
head->next=NULL;
pre=head;
for(i=0;i<n;i++) //输入分数
{
scanf("%d",&tmp);
pcur=(node *)malloc(sizeof(struct node));
pcur->data=tmp;
pre->next=pcur;
pre=pcur;
}
pcur->next=NULL;
for(i=0;i<m;i++) //输入操作内容
{
getchar();
scanf("%c",&v_cTemp);
scanf("%d %d",&A,&B);
switch (v_cTemp)
{
case 'Q':
{
if(A>B)
{
int temp=A;
A=B;
B=temp;
}
printf("%d\n",GetMax(head,A,B));
break;
}
break;
case 'U':
UpdateScore(head,A,B);
break;
default:
break;
}
}
}
return 0;
}
2. 使用数组(推荐)
#include<stdio.h>
#include <stdlib.h>
int GetMax(int *arr,int A,int B)
{
int max=arr[A];
for(int i=A+1;i<=B;i++)
{
if(arr[i]>max)
max=arr[i];
}
return max;
}
int Update(int *arr,int A,int B)
{
arr[A]=B;
return 1;
}
int main()
{
int n,m;
char ch;
int *p=NULL;
int A;
int B;
while(~scanf("%d %d",&n,&m))
{
if(n==0||m==0)
return 0;
p=new int[n];
for (int i=0;i<n;i++)
{
scanf("%d",&p[i]);
}
while (m>0)
{
getchar();
scanf("%c",&ch);
scanf("%d %d",&A,&B);
if (ch=='Q')
{
if(A>B)
{
A=A^B;
B=A^B;
A=A^B;
}
printf("%d\n",GetMax(p,A-1,B-1));
}
if (ch=='U')
{
Update(p,A-1,B);
}
m--;
}
delete []p;
p=NULL;
}
return 0;
}