pat甲级1002 A+B for Polynomials
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 sum 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 to 1 decimal place.
Sample Input:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample Output:
3 2 1.5 1 2.9 0 3.2
这道题又搞了一个多小时,多项式和为0 的时候没考虑到。另一个卡的时间最长的就是格式上,本想用cout实现,没成功,最后用printf.
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
#include<iomanip>
using namespace std;
int main()
{
int k1, k2,ex;
float co;
vector<pair<int, float>>vec;
pair<int, float>p1;
cin >> k1;
for (int i = 0; i < k1; i++)
{
cin >> ex >> co;
vec.push_back(make_pair(ex,co));
}
cin >> k2;
for (int i = 0; i < k2; i++)
{
bool flag = false;
cin >> ex >> co;
for (auto& p : vec)
{
if (p.first == ex)
{
flag = true;
p.second = co + p.second;
}
}
if (!flag)
{
{
p1.first = ex;
p1.second = co;
vec.push_back(p1);
}
}
}
sort(vec.begin(), vec.end(), [](const auto a, const auto b) {
return a.first > b.first;
});
vec.erase(remove_if(vec.begin(), vec.end(), [](const auto& a) {return a.second == 0;}),vec.end());
if (vec.size() == 0)
{
cout << vec.size();
return 0;
}
cout << vec.size() << " ";
int count = 0;
for (auto c : vec)
{
printf("%d ", c.first);
printf("%.1f", c.second);
count++;
if (count != vec.size())
cout << " ";
}
cout << endl;
}