目录
- T1. 波兰表达式
- T2. 多项式相加
- 思路分析
- T3. 扑克牌排序
- 思路分析
- T4. 表达式求值
- 思路分析
T1. 波兰表达式
题目链接:SOJ D1087
此题为 2023 年 12 月三级第三题原题,见 2023 年 12 月青少年软编等考 C 语言三级真题解析中的 T3。
T2. 多项式相加
题目链接:SOJ D1088
我们经常遇到两多项式相加的情况,在这里,我们就需要用程序来模拟实现把两个多项式相加到一起。首先,我们会有两个多项式,每个多项式是独立的一行,每个多项式由系数、幂数这样的多个整数对来表示。
如多项式 2 x 20 − x 17 + 5 x 9 − 7 x 7 + 16 x 5 + 10 x 4 + 22 x 2 − 15 2x^{20}- x^{17}+ 5x^9- 7x^7+ 16x^5+ 10x4 + 22x^2- 15 2x20−x17+5x9−7x7+16x5+10x4+22x2−15,对应的表达式为:2 20 -1 17 5 9 -7 7 16 5 10 4 22 2 -15 0
。
为了标记每行多项式的结束,在表达式后面加上了一个幂数为负数的整数对。同时输入表达式的幂数大小顺序是随机的。我们需要做的就是把所给的两个多项式加起来。
时间限制:1 s
内存限制:64 MB
- 输入
输入包括多行。
第一行整数 n n n,表示有多少组的多项式需要求和, 1 < n < 100 1 < n < 100 1<n<100。
下面为 2 n 2n 2n 行整数,每一行都是一个多项式的表达式。表示 n n n 组需要相加的多项式。每行长度小于 300 300 300。 - 输出
输出包括 n n n 行,每行为 1 1 1 组多项式相加的结果。在每一行的输出结果中,多项式的每一项用[x y]
形式的字符串表示, x x x 是该项的系数、 y y y 是该项的幂数。要求按照每一项的幂从高到低排列,即先输出幂数高的项、再输出幂数低的项。 系数为零的项不要输出。 - 样例输入
2 -1 17 2 20 5 9 -7 7 10 4 22 2 -15 0 16 5 0 -1 2 19 7 7 3 17 4 4 15 10 -10 5 13 2 -7 0 8 -8 -1 17 2 23 22 2 6 8 -4 7 -18 0 1 5 21 4 0 -1 12 7 -7 5 3 17 23 4 15 10 -10 5 13 5 2 19 9 -7
- 样例输出
[ 2 20 ] [ 2 19 ] [ 2 17 ] [ 15 10 ] [ 5 9 ] [ 6 5 ] [ 14 4 ] [ 35 2 ] [ -22 0 ] [ 2 23 ] [ 2 19 ] [ 2 17 ] [ 15 10 ] [ 6 8 ] [ 8 7 ] [ -3 5 ] [ 44 4 ] [ 22 2 ] [ -18 0 ]
- 提示
第一组样例数据的第二行末尾的8 -8
,因为幂次 − 8 -8 −8 为负数,所以这一行数据结束,8 -8
不要参与计算。
思路分析
此题考查模拟算法,属于基础题。
可以用结构体存储多项式中每一项的系数和指数,然后将两个多项式分别按照指数非递增的顺序进行排序。接下来采用双指针依次遍历两个多项式,对于每一个指数,需要做的就是合并同类项:
- 如果 p o l y _ a i poly\_a_i poly_ai 的系数与 p o l y _ b j poly\_b_j poly_bj 的指数相等,则将两个多项式中与当前指数相等的所有项(同类项)的系数都累加起来;
- 如果 p o l y _ a i poly\_a_i poly_ai 的指数大于 p o l y _ b j poly\_b_j poly_bj,则将多项式 p o l y _ a poly\_a poly_a 中与当前指数相等的所有项的系数累加起来;
- 如果 p o l y _ a i poly\_a_i poly_ai 的指数小于 p o l y _ b j poly\_b_j poly_bj,则将多项式 p o l y _ b poly\_b poly_b 中与当前指数相等的所有项的系数累加起来;
每个指数对应的系数累加完毕之后,检测当前系数是否为 0 0 0,如果不为 0 0 0,则输出当前项的系数和指数。
/** Name: T2_1.cpp* Problem: 多项式相加* Author: Teacher Gao.* Date&Time: 2025/03/07 22:47*/#include <bits/stdc++.h>using namespace std;struct node {int x, y;node () {}node (int _x, int _y) : x(_x), y