zoukankan      html  css  js  c++  java
  • PTA (Advanced Level) 1009 Product of Polynomials

    1009 Product of 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 N1​​ aN1​​​​ N2​​ aN2​​​​ ... NK​​ aNK​​​​

      where K is the number of nonzero terms in the polynomial, Ni​​ and aNi​​​​ (,) are the exponents and coefficients, respectively. It is given that 1, 0.

    Output Specification:

      For each test case you should output the product 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 up to 1 decimal place.

    Sample Input:

    2 1 2.4 0 3.2
    2 2 1.5 1 0.5
    

    Sample Output:

    3 3 3.6 2 6.0 1 1.6

    解题思路:
      本题给出两个多项式要求计算并输出相乘后的多项式,第一行首先给出多项式A的项数K,之后跟随2K个数,即以指数 系数的方式给出A的每一项,第二行以与多项式A相同的方式给出多项式B的信息。

           要求首先输出相乘后多项式的项数,之后按指数由小到大输出多项式的指数与系数

      模拟运算过程,以三个double型的数组A、B、C记录给出的多项式与答案。

      按要求输入多项式A,在输入多项式B时每输入一项便与A的每一项相乘,答案加入数组C中,遍历C统计非零项数量并输出,按下标由大到小输出C的非零项即可。

    #include <bits/stdc++.h>
    using namespace std;
    const int MAX = 1e6+10;
    //指数最大为1000,多项式相乘后的最大情况无非1000*1000
    double A[MAX], B[MAX], C[MAX];
    //A、B为给定多项式,C记录答案
    int main()
    {
        int k, max_eA = INT_MIN, max_eB = INT_MIN;
        scanf("%d", &k);
        while(k--){ //输入多项式A
            int en; //指数
            double cn;  //系数
            scanf("%d%lf", &en, &cn);
            A[en] = cn;
            max_eA = max(max_eA, en);   //记录多项式A的最大指数
        }
        scanf("%d", &k);
        while(k--){ //输入多项式B
            int en; //指数
            double cn;  //系数
            scanf("%d%lf", &en, &cn);
            B[en] = cn;
            for(int i = max_eA; i >= 0; i--)
                C[i + en] += A[i] * B[en];//将该多项式B的项与多项式A的所有项对应相乘
            max_eB = max(max_eB, en);   //记录多项式B的最大指数
        }
        int cnt = 0;    //cnt记录答案C的非零项数
        for(int i = max_eA + max_eB; i >= 0; i--)
            if(C[i] != 0.0)
                cnt++;
        printf("%d", cnt); //输出答案项数
        for(int i = max_eA + max_eB; i >= 0; i--)  //输出答案多项式C
            if(C[i] != 0.0)
                printf(" %d %.1f", i, C[i]);
        return 0;
    }

      若第一个测试点(测试点0)不通过,多半是double类型运算时误差的锅(输入A、B完成后再两个for循环运算就可能会出现这种问题)。



  • 相关阅读:
    乘积最大(动规)
    电话圈(floyd)
    孪生蜘蛛
    解题报告
    最大上升子序列和
    怪盗基德的滑翔翼(还是最长x序列)
    最长公共子序列
    合唱队形(动规,最长不下降子序列)
    课堂笔记 4.6
    2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest I Lottery
  • 原文地址:https://www.cnblogs.com/suvvm/p/10726145.html
Copyright © 2011-2022 走看看