• pat 1002. A+B for Polynomials (25)


    1002. A+B for Polynomials (25)

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    16000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    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 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

    解:有点类似多项式相加,略简单,我第一反应是应该用map,hash应该也行,我用的map,两次输入,根据id值进行判断,相同累加,不同新map[key]=value,要注意的就是当相加之后出现0的情况,对此我们需要额外判断,比如说根据题目要求,如下输入输出应该通过:
    Sample Input
    2 1 2.4 0 3.2
    2 1 -2.4 0 -3.2
    
    Sample Output
    0
    对于这种情况要特殊考虑,变换一下控制条件。

    代码如下:
    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<map>
    using namespace std;
    int main()
    {
        int cnt1,cnt2=0;
        while(scanf("%d",&cnt1)==1)
        {
            map<int,double> ans;
            int no;
            double value;
            for(int i=0;i<cnt1;i++)
            {
                scanf("%d%lf",&no,&value);
                ans[no]=value;
            }
            scanf("%d",&cnt2);
            for(int i=0;i<cnt2;i++)
            {
                scanf("%d%lf",&no,&value);
                if(ans.find(no)!=ans.end())
                {
                    ans[no]+=value;
                }
                else
                    ans[no]=value;
            }
            int n=0;
            map<int,double>::iterator q;
            for(q=ans.begin();q!=ans.end();q++)
            {
                if(q->second!=0)
                    n++;
            }
            printf("%d",n);
            if(n!=0)
            {
                map<int,double>::reverse_iterator p;
                for(p=ans.rbegin();p!=ans.rend();p++)
                {
                    if(p->second!=0)
                    {
                        printf(" %d %.1lf",p->first,p->second);
                    }
                }
            }
            cout<<endl;
        }
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    设计模式命令模式(Command)
    设计模式责任链模式(COR)
    设计模式备忘录模式(Memento)
    设计模式中介者模式(Mediator)
    设计模式策略模式(Strategy)
    设计模式解释器模式(Interpreter)
    设计模式迭代器模式(Iterator)
    设计模式状态模式(State)
    Ext终于开始收费了
    设计模式观察者模式(Observer)
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965311.html
Copyright © 2020-2023  润新知