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 N ​1 ​​ a ​N ​1 ​​ ​​ N ​2 ​​ a ​N ​2 ​​ ​​ … N ​K ​​ a ​N ​K ​​ ​​ .
where K is the number of nonzero terms in the polynomial, N ​i ​​ and a ​N ​i ​​ ​​ (i=1,2,⋯,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10,0≤N ​K ​​ <⋯

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

题目大意:
A和B是两个多项式,第一个给定项数,后面给的是指数和系数。

代码如下:

#include <iostream>
using namespace std;
int main()
{
    int n,k=2,flag=0,ex,c=0;
    float co,a[1001]={0};
    while(k--){
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>ex>>co;
            a[ex]+=co;
        }
    }
    for(int i=0;i<1001;i++)
        if(a[i]!=0) flag++;
    cout<<flag;
    for(int i=1000;i>=0;i--)
        if(a[i]!=0) printf(" %d %.1f",i,a[i]);
    return 0;
}

来总结一下:
1)还记得之前说的,将某一个数作为地址的话可以用map容器替代。这个题同样是这样,但是经过我这次的研究发现,虽然可以换成map容器但是,map容器的操纵比数组要麻烦不少。
首先,map容器默认升序,要是想要降序打出的话,就比较费劲,而对于数组来说,可以直接用sort函数来进行排序。(后来才知道可以反向遍历)
其次,map函数的遍历需要用迭代器遍历,不像数组这么简单,直接下标访问就行。
最后,如图:

for(auto it=m.begin();it!=m.end();it++)
    if(it->second!=0) cout<<it->second<<" ";

对于题目中给出的测试样例,应该打印出的是3.2、2.9、1.5,然而实际打印出来的只有3.2,到现在都没明白这是为啥。。。。。
而如果这样写:

for(auto it=m.end();it!=m.begin();it++)
    if(it->second!=0) cout<<it->second<<" ";
if(m.begin()->second!=0) cout<<it->second<<" "    

打印输出的就是3.2、2.9、1.5,给我整懵了。。。。

对于map容器还有一点,如果想要反向遍历,可以使用。

for(auto it=m.rbegin();it!=m.rend();it++)

你可能感兴趣的:(PAT甲级)