微信公众号: CodeFun
题意
求A有序多项式+B有序多项式后的有序多项式,输入中前者是指数,后者是系数。
思路
1. 双指针法
- 思想:用一个指针遍历a数组,一个指针遍历b数组。比较两者的指数大小。如果a当前指向的元素指数大的话,将此元素放入答案数组,同时a当前指针往后移动一个。同理对b进行同样的操作。如果a和b当前的指针相同,则将其系数相加(不为0)放入答案数组。
- 边界条件:可能会导致a或b提前遍历完,所以要将剩余的元素全部push进入答案数组里面。
2. 哈希
- 思想:可以以指数为索引,利用 建立映射关系。
- 边界条件:在统计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;
}