オリジナルタイトル
この時間は、あなたはAとBの2つのあり、A + Bを見つけることになっている
多項式を。
入力仕様:
各入力ファイルは、1つのテストケースが含まれています。各ケースには2行を占め、
各ラインは、多項式の情報が含まれている:
KN 1 N 1 N 2 N 2 ... N K N Kここで、Kは、多項式における非ゼロ項の数であり、N I及びN I(iは1,2 =⋯、K)指数及び係数は、それぞれ。それが与えられること1≤K≤10,0≤N K <⋯<N 2 <N 1 ≤1000。
出力仕様:
各テストケースのためには、1つのラインの出力AとBの合計を、べき
入力と同じフォーマットです。NO余分がなければならないことに注意してください
各行末のスペース。小数第1位まで正確でください。サンプル入力:
2 1 2.4 0 3.2 2 2 1.5 1 0.5
サンプル出力:
3 2 1.5 1 2.9 0 3.2
分類
マップの配列(マップまたはカスタムハッシュ配列)
問題の意味を説明します
そして、2つの多項式を計算します
アイデア解析
- そして、多項式を計算し、同じ次項の係数がに追加されます
- 2つの多項式指定されたタイトルは、各入力kの最初の数は、非ゼロ係数の用語の数、及びインデックスの係数kを表します。請求項1小数点以下の場所での結果。
- いくつかの点に注意してください。
- 係数の個数と相互に反対数は、最終的な結果が出力されない場合
- 加算結果は係数0と同じになった後、出力が「0」である(任意の出力後、もはや存在し)
参照コード
方法1:マップ記憶の係数、および非ゼロのCNTとの結果の記録
#include <cstdio>
#include <map>
using namespace std;
map <int, double> res;
int main(){
int k, ex;
double co;
scanf("%d", &k);
//cnt 记录结果中非零项个数
int cnt = 0;
for (int i = 0; i < k ; ++i) {
scanf("%d%lf", &ex, &co);
res[ex] = co;
cnt++;
}
scanf("%d", &k);
for (int i = 0; i < k ; ++i) {
scanf("%d%lf", &ex, &co);
//第一个多项式中无对应次数项,则结果中的非零项自增1
if(res[ex] == 0) cnt++;
res[ex] += co;
//两非零项相加结果为0,则结果中的非零项自减1
if(res[ex] == 0) cnt--;
}
printf("%d", cnt);
if(cnt == 0){
return 0 ;
}
auto it = res.end();
while(it != res.begin()){
it--;
if(it->second!=0){
printf(" %d %.1lf", it->first, it->second);
}
}
return 0;
}
方法2:同じ係数メモリマップではなく、CNT中の非ゼロ係数の結果を記録しません
#include <cstdio>
#include <map>
using namespace std;
map<int, double> res;
int main() {
int k, ex;
double co;
scanf("%d", &k);
for (int i = 0; i < k; ++i) {
scanf("%d%lf", &ex, &co);
res[ex] = co;
}
scanf("%d", &k);
for (int i = 0; i < k; ++i) {
scanf("%d%lf", &ex, &co);
res[ex] += co;
//相加结果为0时直接移除对应项
if (res[ex] == 0) res.erase(ex);
}
printf("%d", res.size());
if (res.size() == 0) {
return 0;
}
auto it = res.end();
while (it != res.begin()) {
it--;
if (it->second != 0) {
printf(" %d %.1lf", it->first, it->second);
}
}
return 0;
}