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<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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值