PAT甲级1002 A+B for Polynomials (25分)(一堆坑)

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 a​N​1 N2 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≤NK<⋯

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
思路分析:英语真的是硬伤,大概能知道这是啥意思,能找出规律来,但是我却不知道polynomials是多项式,exponents是指数,coefficients是系数,当时就感觉这两个词一定有什么特殊含义。。。既然这样了,那当对应指数位置的系数相加和为0时,直接跳过,最终不输出(反正我是完全没get到这个,不过多项式确实是这样)。还有最终是按照指数降序输出的,而map集合默认是按键升序的,所以需要指定一下(好久不用,我都忘了怎么用了)。注意空格的位置和最终结果精确到小数点后一位(Please be accurate to 1 decimal place.)。这题上来我就坚定不移地想用map。。用数组也可以,在参考其他人写的时候看到了。
还学到了一种新的方式来逆序迭代容器中的元素,即本题中用来存放最终结果的res容器,可以在声明的时候并不指定其排序规则,而是在最后输出的时候按照降序输出(因为本身默认对存入的数据按键升序排序)。注意必须是reverse_iterator,否则编译报错

c.rbegin()  传回一个逆向队列的第一个数据。
c.rend()  传回一个逆向队列的最后一个数据的下一个位置。

for(map<int,double>::reverse_iterator it2 = res.rbegin();it2!=res.rend();it2++){
        printf(" %d %.1lf",it2->first,it2->second);
}
#include 
#include 
#include 
using namespace std;

int main(){
    map<int,double> m;
    map<int,double,greater<int>> res;
    int k1,k2,exp;
    double coe;
    cin >> k1;
    for(int i = 0;i<k1;i++){
        cin >> exp >> coe;
        m[exp] += coe;
        /*m.insert(make_pair(exp,coe));也可以,两种都对,map有默认值*/
    }
    cin >> k2;
    for(int i = 0;i<k2;i++){
        cin >> exp >> coe;
        m[exp] += coe;
        /*在相同的指数位置处进行相加操作,同时这样操作也保证了当没有相同指数的时候,
		  也要添加到res容器中
		*/
    }
    for(map<int, double>::iterator it = m.begin(); it != m.end(); it++){
        if(it->second!=0){//系数和为0跳过
            res.insert(make_pair(it->first,it->second));
        }
    }
    cout << res.size();
    for(map<int, double>::iterator it2 = res.begin(); it2!=res.end(); it2++){
        printf(" %d %.1lf",it2->first,it2->second);
    }
    return 0;
}

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