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
多项式求和,做这道题卡了好久,一开始看输出结果以为是以 coefficients 系数来排序,由于我用的是map来做,结果map不支持对value值进行排序,只能通过放到vector里面进行排序,然而。。。。。
#include <iostream>
#include "cstring"
#include <stdio.h>
#include "iomanip"
#include "vector"
#include "cmath"
#include "stack"
#include "algorithm"
#include <math.h>
#include "map"
using namespace std;
typedef
pair<double,double>PAIR;//由于MAP不是连续的,要使用vector的sort,只能把map改成pair
struct
CmpByValue //自定义的cmp
{ bool operator()(const
PAIR&
lhs,
const
PAIR&
rhs)
{
return
lhs.second
<
rhs.second;
}
};
int main()
{
int k;
cin>>k;
map <double,double>a;
int i;double n,an;
for(i=0;i<k;i++)
{
cin>>n>>an;
a[n]+=an;
}
cin>>k;
for(i=0;i<k;i++)
{
cin>>n>>an;
a[n]+=an;
}
cout<<a.size()<<" ";
vector<PAIR>abc(a.begin(),a.end() );
sort(abc.begin(),abc.end(),CmpByValue());
for(i=0;i<abc.size();i++)
{
cout<<abc[i].first<<" "<<abc[i].second;
if(i!=abc.size()-1)
cout<<" ";
}
return 0;
}
调了好久没搞出来,去网上搜了一下发现原来是按照exponents 排序,,那就好办了,直接map就行了,map默认是按照key从小到大,用个反转迭代器反向输出把,刚好和答案相反。需要注意一点要对系数进行一个判断合法
#include <iostream>
#include "cstring"
#include <stdio.h>
#include "iomanip"
#include "vector"
#include "cmath"
#include "stack"
#include "algorithm"
#include <math.h>
#include "map"
using namespace std;
int main()
{
int k,q=0;
cin>>k;
map <int,double>a;
int i;double n,an;
for(i=0;i<k;i++)
{
cin>>n>>an;
a[n]+=an;
}
cin>>k;
for(i=0;i<k;i++)
{
cin>>n>>an;
a[n]+=an;
}
int s=0;
map<int,double> ::reverse_iterator it;
map<int,double> ::const_iterator ii;
for(ii=a.begin();ii!=a.end();ii++)
{
if(ii->second!=0.0&&ii->second!=-0.0)
s++;
}
cout<<s;
for( it=a.rbegin();it!=a.rend();it++)
{ if(it->second!=0.0&&it->second!=-0.0)
cout<<" "<<it->first<<" "<<fixed<<setprecision(1)<<it->second;
}
cout<<endl;
return 0;
}