1002. A+B for Polynomials (25)
This time, you are supposed to find A+B where A and B are two polynomials.
Input
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
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 Input2 1 2.4 0 3.2 2 2 1.5 1 0.5Sample Output
3 2 1.5 1 2.9 0 3.2
# include <cstdio>
# include <iostream>
using namespace std;
# define Size 10001
struct Node
{
double a;
int n;
Node(){}
void Set(int N,double A){a=A,n=N;}
void Read()
{
scanf("%d%lf",&n,&a);
}
void Print()
{
printf(" %d %.1f",n,a);
}
};
struct NodeArray
{
Node *Array;
int End,Lenth;
NodeArray(int n = Size):End(0),Lenth(Size)
{
Array = new Node[Size];
}
void Add()
{
Array[End++].Read();
}
void Add(double a,int n)
{
Array[End++].Set(n,a);
}
void PrintArray()
{
printf("%d",End);
for (int i=0;i<End;i++)
Array[i].Print();
cout << endl;
}
};
int main()
{
NodeArray a1,a2,ans;
int k;
cin >> k;
while (k--)
a1.Add();
//cout << "here" << endl;
cin >> k;
while (k--)
a2.Add();
int i=0,j=0;
//a1.PrintArray();
//a2.PrintArray();
while (i<a1.End&&j<a2.End)
{
Node& s1 = a1.Array[i];
Node& s2 = a2.Array[j];
if (s1.n>s2.n)
ans.Add(s1.a,s1.n),i++;
else if (s1.n<s2.n)
ans.Add(s2.a,s2.n),j++;
else
{
if ((s2.a+s1.a)>1e-2)
ans.Add(s2.a+s1.a,s1.n);
i++,j++;
}
}
while (i<a1.End)
{
Node& s1 = a1.Array[i];
ans.Add(s1.a,s1.n),i++;
}
while (j<a2.End)
{
Node& s2 = a2.Array[j];
ans.Add(s2.a,s2.n),j++;
}
ans.PrintArray();
return 0;
}