zoukankan      html  css  js  c++  java
  • PAT 解题报告 1009. Product of 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 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 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


    题目描述:

    给定两个多项式的系数和指数, 算着两个多项式的乘积.

    算法分析:

    思路1:map保存项

    用map保存项,计算结果需要剔除map项值==0的项。

    思路2:hash保存项

    注意点:

    用map保存项,结果需要剔除map项值==0的项。

    map

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <map>
    
    using namespace std;
    
    int main()
    {
        int K, L;
        map<int,double> m1,m2,mp;
        scanf("%d", &K);
        for (int i=0; i<K; i++){
            int e;double c;
            scanf("%d%lf", &e, &c);
            m1[e] = c;
        }
        scanf("%d", &L);
        for (int i=0; i<L; i++) {
            int e;double c;
            scanf("%d%lf", &e, &c);
            m2[e] = c;
        }
    
        map<int,double>::iterator it1,it2,it;
        for (it1=m1.begin(); it1!=m1.end(); it1++) {
            for (it2=m2.begin(); it2!=m2.end(); it2++) {
                int key = it1->first + it2->first;
                double value = it1->second * it2->second;
                it = mp.find(key);
                if (it == mp.end()) {
                    mp[key] = value;
                }
                else {
                    it->second += value;
                }
            }
        }
        for(it=mp.begin(); it!=mp.end();) {
            if (it->second == 0.0) {
                mp.erase(it++);
            }
            else it++;
        }
        printf("%d", mp.size());
        map<int,double>::reverse_iterator rit;
        for (rit=mp.rbegin(); rit!=mp.rend(); rit++) {
            printf(" %d %.1lf", rit->first, rit->second);
        }
        return 0;
    }

    hash

    #include<cstdio>
    #include<cstring>
    
    #define MAXN 2001
    double hash[MAXN],hash1[MAXN];
    
    int main(){
        freopen("in.txt","r",stdin);
        int n1,n2,i,j,k;
        double tmp;
        //scanf("%d",&n1);
        while(scanf("%d",&n1)!=EOF){
            memset(hash,0,sizeof(hash));
            memset(hash1,0,sizeof(hash1));
            for(i=0;i<n1;i++){
                scanf("%d%lf",&k,&tmp);
                hash1[k]=tmp;
            }
            scanf("%d",&n2);
            for(i=0;i<n2;i++){
                scanf("%d%lf",&k,&tmp);
                for(j=1000;j>=0;j--){
                    hash[j+k]+=hash1[j]*tmp;
                }
            }
            int count=0;
            for(i=0;i<MAXN;i++){
                if(hash[i]!=0) count++;
            }
            if(count==0) printf("0
    ");
            else{
                printf("%d",count);
                for(i=MAXN-1;i>=0;i--){
                    if(hash[i]!=0) printf(" %d %.1lf",i,hash[i]);
                }
                printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    Acwing199 余数之和
    试题 算法提高 WYF的交易地点(简单计算几何)
    试题 算法提高 八数码(bfs)
    试题 算法提高 合唱队形(dp)
    牛客练习 牛牛的mex(维护前缀后缀最小值)
    牛客练习 牛牛的算术(数学、规律)
    试题 算法提高 树的直径(dfs)
    高精度乘法(板子)
    试题 算法提高 不重叠的线段(dp)
    拜托了,牛老师(dfs)
  • 原文地址:https://www.cnblogs.com/549294286/p/3571573.html
Copyright © 2011-2022 走看看