PTA甲级 1002 A+B for Polynomials

微信公众号: CodeFun

题意

求A有序多项式+B有序多项式后的有序多项式,输入中前者是指数,后者是系数。

思路

1. 双指针法

  • 思想:用一个指针遍历a数组,一个指针遍历b数组。比较两者的指数大小。如果a当前指向的元素指数大的话,将此元素放入答案数组,同时a当前指针往后移动一个。同理对b进行同样的操作。如果a和b当前的指针相同,则将其系数相加(不为0)放入答案数组。
  • 边界条件:可能会导致a或b提前遍历完,所以要将剩余的元素全部push进入答案数组里面。

2. 哈希

  • 思想:可以以指数为索引,利用 m a p < i n t , d o u b l e , g r e a t e r < i n t > > map<int,double,greater<int>> 建立映射关系。
  • 边界条件:在统计map元素个数的时候,去掉系数为0的元素

代码

1. 双指针法

#include <bits/stdc++.h>
using namespace std;
struct node{
    int expon;
    double coef;
};//结构体保存数据
int main(){
    vector<node> a,b,ans;
    int m,n;
    node temp;
    cin>>m;//输入
    for(int i=0;i<m;i++){
        cin>>temp.expon>>temp.coef;
        a.push_back(temp);
    }
    cin>>n;//输入
    for(int i=0;i<n;i++){
        cin>>temp.expon>>temp.coef;
        b.push_back(temp);
    }
    int i=0,j=0;//双指针 i扫描a数组,j扫描b数组
    while(i<m&&j<n){
        if(a[i].expon>b[j].expon)
            ans.push_back(a[i++]);
        else if(a[i].expon<b[j].expon)
            ans.push_back(b[j++]);
        else {
            temp.expon=a[i].expon;
            temp.coef=a[i++].coef+b[j++].coef;
            if(temp.coef)ans.push_back(temp);//系数为0不考虑
        }
    }
    while(i<m) ans.push_back(a[i++]);//a剩下来
    while(j<n) ans.push_back(b[j++]);//b剩下来
    cout<<ans.size();
    for(int i=0;i<ans.size();i++) printf(" %d %.1f",ans[i].expon,ans[i].coef);
    return 0;
}

2. 哈希

#include <bits/stdc++.h>
using namespace std;
map<int,double,greater<int> > ans;
int main(){
    int n,expon,cnt=0;
    double coef=0;
    for(int i=0;i<2;i++){//两次输入
        cin>>n;
        while(n--) {
            cin>>expon>>coef;
            ans[expon]+=coef;
            if(!ans[expon]) cnt++;//统计系数为0的个数
        }
    }
    cout<<ans.size()-cnt;//元素个数减掉系数为0的个数
    for(auto it:ans)
        if(it.second!=0) printf(" %d %.1f",it.first,it.second);
    return 0;
}
发布了83 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43077261/article/details/103788757