多項式のためのPAT-A1002 A + B(25分)

オリジナルタイトル

この時間は、あなたは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つの多項式を計算します

アイデア解析

  1. そして、多項式を計算し、同じ次項の係数がに追加されます
  2. 2つの多項式指定されたタイトルは、各入力kの最初の数は、非ゼロ係数の用語の数、及びインデックスの係数kを表します。請求項1小数点以下の場所での結果。
  3. いくつかの点に注意してください。
  • 係数の個数と相互に反対数は、最終的な結果が出力されない場合
  • 加算結果は係数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;
}

方法3:ハッシュはここでは繰り返されない方法と同様係数アレイに格納されてもよいです。

リリース5元の記事 ウォンの賞賛0 ビュー760

おすすめ

転載: blog.csdn.net/qq_36382924/article/details/104068194