写的很抽象,不应该用map的,应该直接两层for遍历
题目地址:
1009 Product of Polynomials - PAT (Advanced Level) Practice (pintia.cn)
https://pintia.cn/problem-sets/994805342720868352/exam/problems/type/7?problemSetProblemId=994805509540921344&page=0
介绍
This time, you are supposed to find A×B where A and B are two polynomials
Input Specification:
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:
K N1 aN1 N2 aN2 ... NK aNK
where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1,2,⋯,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10, 0≤NK<⋯<N2<N1≤1000
Output Specification:
For each test case you should output the product of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
void solve() {
ll n,m;
cin>>n;
map<int,double>ssr;
double i2;
int i1;
for(int i=0;i<n;i++)
{
cin>>i1>>i2;
ssr.insert(pair<int,double>(i1,i2));
}
map<int,double>num1;
cin>>m;
for(int i=0;i<m;i++)
{
cin>>i1>>i2;
for(auto i=ssr.begin();i!=ssr.end();i++)
{
int o1=i->first;
double o2=i->second;
if(num1.find(o1+i1)==num1.end())
num1.insert(pair<int,double>(i1+o1,i2*o2));
else
{
double key1=num1.find(o1+i1)->second+i2*o2;
/*num1.insert(pair<int,double>(i1+o1,key1));*/
num1[i1+o1]=key1;
}
}
}
i1=0;
int i3=0;
vector<int> num;
for(auto i=num1.begin();i!=num1.end();i++)
{
int o1=i->first;
num.push_back(o1);
if(i->second!=0)
{
i3++;
}
i1++;
}
sort(num.begin(),num.end());
cout<<i3;
for(int i=i1-1;i>=0;i--)
{
if(num1.find(num[i])->second==0)
{
continue;
}
cout<<" "<<num[i]<<" ";
printf("%.1lf",num1.find(num[i])->second);
}
}
signed main() {
ll t = 1;
// std::cin >> t;
while (t--) {
solve();
}
}