题目要求:
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
算法思想:
这道题整体来说还是比较简单的,但是也能体现出pat甲级的特点,即需要考虑的方面比较多。
首先:注意输入的时候要用double 类型;输入为%lf ,输出为 %.1f
其次:注意录入的次数可能最后相加结果为0;在这里我使用的一个set来存储不为0的次数,如果相加为0时从set中删除
第三:需要注意最大值,最小值怎么获得
这里我利用了set自动排序的特点,使用begin和end来得到最大最小值。
第四: 注意系数全为0时怎么处理
代码展示:
#include <cstdio>
#include <set>
using namespace std;
const int maxSize=1010;
double coefficient[maxSize]={0};
int main(){
int max=-1,min = maxSize;
int k,n;
double coe;
set<int> count;
for(int i=0;i<2;i++){
scanf("%d",&k);
for(int i = 0;i<k;i++){
scanf("%d %lf",&n,&coe);
count.insert(n);
coefficient[n] += coe;
if(coefficient[n] == 0){
count.erase(n);
}
}
}
// 利用set来获取最大最小值
if(count.size()>0){
set<int>::iterator it = count.begin();
min = *it ;
it = count.end();
it--;
max = *it;
}else{
max= min = 0;
}
//格式化输出
if(count.size()>0){
printf("%d ",count.size());
}else{
printf("%d\n",count.size());
}
for(int i = max;i > min;i--){
if(coefficient[i] != 0 ){
printf("%d %.1f ",i,coefficient[i]);
}
}
if(count.size()>0){
printf("%d %.1f\n",min,coefficient[min]);
}
return 0;
}