我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805509540921344
题目描述:
题目翻译:
1009 多项式乘法
当A和B是两个多项式时,你需要计算A * B。
输入格式:
每个输入文件包含一个测试用例。每个测试用例占2行,每行包含一个多项式的信息:
K N1 aN1 N2 aN2 ... NK aNK
其中K是多项式中非零项的个数,Ni和aNi(i = 1, 2, ..., K)分别是指数和系数。1 <= K <= 10,0 <= NK < ... < N2 < N1 <= 1000。
输出格式:
对每个测试用例,你需要在一行中输出A * B的结果,其形式和输入相同。行末不得有多余空格,系数精确到小数点后1位。
输入样例:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
输出样例:
3 3 3.6 2 6.0 1 1.6
知识点:哈希表
思路:开一个大小为2001的数组记录系数
本题和PAT-ADVANCED1002——A+B for Polynomials几乎一模一样,需要注意的是,本题中乘法的最大系数会是2000。
时间复杂度是O(K1 * K2),其中K1是第一个输入多项式的非零项个数,K2是第二个输入多项式的非零项个数。空间复杂度是O(2001)。
C++代码:
#include<iostream>
#include<vector>
#include<utility>
#include<cmath>
using namespace std;
double coefficients1[1001];
double coefficients2[1001];
double coefficients[2001];
vector<pair<int, double> > results;
int main(){
fill(coefficients1, coefficients1 + 1001, 0.0);
fill(coefficients2, coefficients2 + 1001, 0.0);
fill(coefficients, coefficients + 2001, 0.0);
int K, N;
double aN;
scanf("%d", &K);
for(int i = 0; i < K; i++){
scanf("%d %lf", &N, &aN);
coefficients1[N] += aN;
}
scanf("%d", &K);
for(int i = 0; i < K; i++){
scanf("%d %lf", &N, &aN);
coefficients2[N] += aN;
}
for(int i = 0; i < 1001; i++){
if(fabs(coefficients1[i]) >= 0.00000001){
for(int j = 0; j < 1001; j++){
if(fabs(coefficients2[j]) >= 0.00000001){
coefficients[i + j] += coefficients1[i] * coefficients2[j];
}
}
}
}
for(int i = 2000; i >= 0; i--){
if(fabs(coefficients[i]) >= 0.00000001){
results.push_back(make_pair(i, coefficients[i]));
}
}
printf("%d", results.size());
for(int i = 0; i < results.size(); i++){
printf(" %d %.1f", results[i].first, results[i].second);
}
return 0;
}
C++解题报告: