【PAT1002】-1002 A+B for Polynomials

实现思路

实现的是多项式的加法,也就是对应位开始相加;
一、为方便统一化处理,将读取多样式位数及系数存储到pair这一数据结构中,所有的pair是存储到vector数组中,为方便下一步的操作,将得到的所有数据按照位降序排列。

二、利用到了归并排序的思想,同时遍历两个vector,当两个vector数组系数一样大时相加存储到结果vector中,如果一方较大,那就先存储较大的到结果数组中,该方遍历数据往下移动

三、这样处理完之后还剩余数据的一方依次将结果存入

注意: 题目中要求数据是保留一位小数的,有个取巧的方法就是当有位计算后的数值是小于0.1就说明该数据被截取后的系数为0,题目的陷阱就在此,系数为0的项不输出结果

实现代码

#include <iostream>
#include <cstdio>
#include <utility>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;

bool ccmp1(const pair<int,double> a,const pair<int,double>b){
    
    
    return a.first>b.first;
}
void get_data(int n1,vector<pair<int,double>> &ss){
    
    
    for(int i=0;i<n1;i++){
    
    
        int x1;
        double x2;
        cin>>x1>>x2;
        ss.push_back(make_pair(x1,x2));
    }
    sort(ss.begin(),ss.end(),ccmp1);
}
int main(){
    
    
    int n1,n2;
    vector<pair<int,double>>a,b;
    cin>>n1;
    get_data(n1,a);
    cin>>n2;
    get_data(n2,b);
    int i=0,j=0;
    vector<pair<int,double>> re;
    while(i<a.size()&&j<b.size()){
    
    
        if(a[i].first==b[j].first){
    
    
            int x1=a[i].first;
            double x2=a[i].second+b[j].second;
            if(x2>0.01)
            {
    
    re.push_back(make_pair(x1,x2));}
            i++;
            j++;
        }
        else if(a[i].first>b[j].first){
    
    
            re.push_back(a[i]);
            i++;
        }
        else {
    
    
            re.push_back(b[j]);
            j++;
        }
    }
    while(i<a.size()){
    
    
        re.push_back(a[i]);
        i++;
    }
    while(j<b.size()){
    
    
        re.push_back(b[j]);
        j++;
    }
    cout<<re.size();
    for(int i=0;i<re.size();i++){
    
    
        printf(" %d %.1f",re[i].first,re[i].second);
    }
}

需要掌握输出小数保留为1位
(一)c语言写法:
printf("%.1f",x);
(二)c++写法
#include < iomanip >
cout<<fixed<<setprecision(1)<<x;

提交结果及分析

在这里插入图片描述时间复杂度O(n)

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/114285989