题目
(这是题目链接)https://pintia.cn/problem-sets/994805342720868352/problems/994805526272000000
我的结题思路
分别申请两个动态数组表示两个多项式,然后建立一个静态数组,大小为20,表示结果多项式。然后开始加,加的时候,以一个为主,另一个循环遍历。最后对辅助的那个数组中没有处理的元素,加到结果数组里面。对于结果中的系数为0的项删除,最后对结果多项式按照指数降序排列输出。
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main() {
//k1,k2均表示非零的项数
int k1 = 0;
int k2 = 0;
int k3 = 20;
cin >> k1;
if ((k1 < 1) || (k1 > 10)) return 0; //输入的时候进行数据有效性判断。
//申请动态数组,分别用于存储指数,系数,以及判断该项是否已经计算过了。
int* A1;
A1 = new int[k1];
float* A2;
A2 = new float[k1];
//初始化
for (int i = 0; i < k1; i++) {
cin >> A1[i];
if ((A1[i] < 0) || (A1[i] > 1000)) return 0;
if ((i != 0) && (A1[i] > A1[i - 1])) return 0;
cin >> A2[i];
}
//第二个多项式 同上。
cin >> k2;
if ((k2 < 1) || (k2 > 10)) return 0;
int* B1;
B1 = new int[k2];
float* B2;
B2 = new float[k2];
bool* B3;
B3 = new bool[k2];
for (int i = 0; i < k2; i++) {
cin >> B1[i];
if ((B1[i] < 0) || (B1[i] > 1000)) return 0;
if ((i != 0) && (B1[i] > B1[i - 1])) return 0;
cin >> B2[i];
B3[i] = false;
}
//存储结果多项式的指数和系数。
int* C1;
C1 = new int[k3];
float* C2;
C2 = new float[k3];
//以下是判断的逻辑。
int h1 = 0;
for (int i = 0; i < k1; i++) { //这个的逻辑是以第一个多项式为主,用第二个多项式的每一个与之比较。
C1[h1] = A1[i]; //先就自己放入结果多项式。
C2[h1] = A2[i];
for (int j = 0; j < k2; j++) { //指数相等,则系数相加。并置两者的访问为true.
if (A1[i] == B1[j]) {
C2[h1] = C2[h1] + B2[j];
B3[j] = true;
}
}
h1++;
}
for (int i = 0; i < k2; i++) { //把第二个多项式中还没处理过的元素加入结果多项式。
if (!B3[i]) {
C1[h1] = B1[i];
C2[h1] = B2[i];
h1++;
}
}
//系数为0的,删除。
while(C2[0] == 0 && h1>1) {
for (int g = 0; g < h1 - 1; g++) {
C1[g] = C1[g + 1];
C2[g] = C2[g + 1];
}
h1--;
}
if (h1 == 1 && C2[0] == 0) {
cout << 0;
return 0;
}
//最后这里是对结果数组,按照指数降序排列
for (int i = 0; i < h1; i++) {
for (int j = i+1; j < h1; j++) {
if (C1[j] > C1[i]) {
int temp = C1[j];
C1[j] = C1[i];
C1[i] = temp;
float temp1 = C2[j];
C2[j] = C2[i];
C2[i] = temp1;
}
}
}
cout << h1;
for (int i = 0; i < h1 - 1; i++) {
printf(" %d %.1f ", C1[i], C2[i]);
}
delete[]A1;
delete[]A2;
delete[]B1;
delete[]B2;
delete[]B3;
delete[]C1;
delete[]C2;
return 0;
}
但是这样的话,会有一个测试点不通过,PAT还不给测试数据。不知道错在哪里。可有好友可以指点一二。
算法笔记的代码
#include <cstdio>
const int max_n = 1111;
double p[max_n] = {};
int main() {
int k, n, count = 0;
double a;
scanf("%d", &k);
for (int i = 0; i < k; i++) {
scanf("%d %lf", &n, &a);
p[n] += a;
}
scanf("%d", &k);
for (int i = 0; i < k; i++) {
scanf("%d %lf", &n, &a);
p[n] += a;
}
for (int i = 0; i < max_n; i++) {
if (p[i] != 0) {
count++;
}
}
printf("%d", count);
for (int i = max_n - 1; i >= 0; i--) {
if (p[i] != 0) printf(" %d %.1f", i, p[i]);
}
return 0;
}
看了之后,大为赞叹。写的很简洁,并且通过了所有的测试用例。分析了一下,他的代码牺牲了空间,获得了相对简洁的代码。并且充分利用了这道题的特点,即数组的元素个数最大值是可以确定的。以后做题要充分考虑题目已知的条件,方便写代码。