您的位置:首页 > 其它

【OJ】用链表来实现成绩统计并查询、修改(原题目:最高分多少)

2017-10-23 13:18 337 查看

Description

老师想知道从某某同学到某某同学当中,分数最高的是多少。

现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input

输入包含多组测试数据。

每组输入第一行是两个正整数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。

Output

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

Sample Input

5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5

Sample Output

5
6
5
9


源代码①:

// F 最高分多少.cpp: 定义控制台应用程序的入口点。
//

#include <iostream>
using namespace std;

#define ERROR 0;

typedef struct Node {
int num;
int score;
Node *next;
}Node, *LinkList;

typedef struct Node2 {
char choice;
int a;
int b;
Node2 *next;
}Node2, *LinkList2;

void insert2(LinkList2 &L2, LinkList2 &last2, char choice, int a, int b) {
LinkList2 p;
p = new Node2;
p->choice = choice;
p->a = a;
p->b = b;
p->next = NULL;

if (L2 == NULL) {
L2 = p;
last2 = p;
}
else {
last2->next = p;
last2 = p;
}
}

//将数据插入链表中  尾插
void insert(LinkList &L, LinkList &last, int num, int score) {
LinkList p;
p = new Node;
p->num = num;
p->score = score;
p->next = NULL;

if (L == NULL) {
L = p;
last = p;
}
else {
last->next = p;
last = p;
}
}

//遍历链表查找a到b的最大成绩
int Q(LinkList &L, int a, int b) {
int max = 0;
LinkList p;
p = L;
while (p->num < a) {
p = p->next;
}
while (p != NULL && p->num <= b) {
if (p->score >= max) {
max = p->score;
}
p = p->next;
}
return max;
}

//遍历链表,将a同学成绩该为b;
void U(LinkList &L, int a, int b) {
LinkList p;
p = L;
while (p->num != a) {
p = p->next;
}
p->score = b;
}

void printlist(LinkList &L) {
LinkList p;
p = L;
do {
cout << p->num << "  " << p->score << endl;
p = p->next;
} while (p != NULL);
}
void printlist2(LinkList2 &L2) {
LinkList2 p;
p = L2;
do {
cout << p->choice << " " << p->a << " " << p->b << endl;
p = p->next;
} while (p != NULL);
}

void set(LinkList2 &L2, LinkList &L) {
LinkList2 p;
p = L2;
while (p != NULL) {
if (p->choice == 'Q') {
if (p->a < 1 || p->a>30000 || p->b < 1 || p->b>5000 || p->a > p->b) { return ; }
cout << Q(L, p->a, p->b) << endl;
}
if (p->choice == 'U') {
if (p->a < 1 || p->a>30000) { return; }
U(L, p->a, p->b);
}

p = p->next;
}
}

int main() {
LinkList L, last;
LinkList2 L2, last2;
L = NULL; last = NULL;
L2 = NULL; last2 = NULL;

int m, n, c;
cin >> n >> m;
if (n <= 0 || n > 30000 || m <= 0 || m > 5000) return ERROR;
for (int i = 1; i <= n; i++) {
cin >> c;
insert(L, last,
4000
i, c);
}

char choice;
int a, b;
for (int i = 1; i <= m; i++) {
cin >> choice >> a >> b;
insert2(L2, last2, choice, a, b);
}

set(L2, L);
return 0;
}


运行结果①:



源代码②:

// F 最高分多少.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
using namespace std;

#define ERROR 0

typedef struct Node {
int num;
int score;
Node *next;
}Node ,*LinkList;

//将数据插入链表中  尾插
void insert(LinkList &L,LinkList &last,int num,int score){
LinkList p;
p = new Node;
p->num = num;
p->score = score;
p->next = NULL;

if (L == NULL) {
L = p;
last = p;
}
else {
last->next = p;
last = p;
}
}

//遍历链表查找a到b的最大成绩
int Q(LinkList &L,int a,int b) {
int max=0;
LinkList p;
p = L;
while (p->num < a)	{
p = p->next;
}
while (p != NULL && p->num <= b) {
if (p->score >= max) {
max = p->score;
}
p = p->next;
}
return max;
}

//遍历链表,将a同学成绩该为b;
void U(LinkList &L, int a, int b) {
LinkList p;
p = L;
while (p->num != a)	{
p = p->next;
}
p->score = b;
}

int main() {
LinkList L, last;
L = NULL; last = NULL;

int m, n, c;
cin >> n >> m;
if (n <= 0 || n > 30000 || m <= 0 || m > 5000) return ERROR;
for (int i = 1; i <= n; i++) {
cin >> c;
insert(L, last, i, c);
}

char choice;
int a, b;
for (int i = 1; i <= m; i++) {
cin >> choice >> a >> b;
if (choice == 'Q') {
if (a<1 || a>n || b < 1 || b>n || a > b) { return ERROR; }
cout << Q(L, a, b) << endl;
}

else if (choice == 'U') {
if (a<1 || a>n) { return ERROR; }
U(L, a, b);
}
else { return ERROR; }
}
return 0;
}


运行结果②:



最后:本题是使用链表来实现的。需要对链表有一定的掌握程度。不过还是有小问题的,虽然用VS可以编译通过,但是无法通过OJ评判系统,两种方法都不行,不知道是什么原因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐