【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评判系统,两种方法都不行,不知道是什么原因。
相关文章推荐
- 输出学生成绩。本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。
- java实现华为之老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.
- 用链表写的学生管理系统 成绩的录入与查询都已经是实现了
- 1.题目:通过编程实现,统计1~n有多少个9 提示:n通过参数传入
- 1. 题目:通过编程实现,统计1~n有多少个9 提示:n通过参数传入
- 封装链表库实现单链表:增加,删除,查询,修改,排序,逆转
- 【九度OJ】题目1018:统计同成绩学生人数 解题报告
- 题目:通过编程实现,统计 1~n 有多少个 9
- vue.js实现成绩查询、新增、修改
- 用java面向对象的内容建立学生姓名,学号,id,班级,每一科的成绩,以及对管理员实现(对老师只实现查看):通过名字查询成绩,通过学号查询成绩,通过id修改姓名,通过姓名修改成绩
- 【编程题目】请修改 append 函数,利用这个函数实现两个非降序链表的并集
- 九度OJ题目1018:统计同成绩学生人数
- 九度oj 题目1018:统计同成绩学生人数 【ZJU2006考研机试题4】
- 九度OJ 题目1018:统计同成绩学生人数(利用Hash)
- 用链表写的学生管理系统 成绩的录入与查询都已经是实现了
- 九度OJ题目1018:统计同成绩学生人数
- SQL 按匹配条件的多少查询出匹配度最高的配置数据
- lucene.net 2.9.2 实现索引生成,修改,查询,删除功能
- 汇编语言:在以GRADE为首地址的数组中存放着某班某门课30个学生的成绩。试编写一完整汇编语言程序实现:统计小于60分,60~89分和大于等于90分的学生人数,统计结果分别存放在LOWNUM、MIDD
- 通过编程实现,统计1~n有多少个9 提示:n通过参数传入