机试题 最高分是多少-链表

题目(摘自牛客网华为机试):

老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.

输入描述:
输入包括多组测试数据。
每组输入第一行是两个正整数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;
}



 

猜你喜欢

转载自blog.csdn.net/u012258911/article/details/47962809