マイクロチャンネル公共数:CodeFun
問題の意味
多項式の次数多項式の後に順序付けられた多項式解決A + Bを注文し、前者は係数で入力インデックスです。
思考
1.ダブルフィンガー
- 考え:ポインタの配列を横断する、ポインタは、配列bを横断します。2つのインデックスのサイズを比較してください。現在のポインタバックを移動させながら現在の要素は、大きなインデックス、配列にこの要素に対する答えを指摘している場合。同様に、同じ動作Bへ。aおよびbは現在のポインタと同じである場合、それは加算される係数(非ゼロの)配列に答え。
- 境界条件:AまたはBはそう答えアレイ内部に残りのすべての要素をプッシュするために、早期の横断につながるかもしれません。
2.ハッシュ
- アイデア:缶インデックスindex、使用 マッピングを確立します。
- 境界条件:マップ要素は、要素は係数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;
}