今回は、AとBが2つの多項式であるA + Bを見つけることになっています。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各ケースには2行を占め、各ラインは、多項式の情報が含まれている:
KN 1 N1 N 2 、N 2 ... N K NK
K多項式における非ゼロ項の数であり、Nは、NiをIAND (i = 1,2、⋯、K)はそれぞれ指数と係数です。それが与えられること1≤K≤10,0≤N K <⋯<N 2 <N 1 ≤1000。
出力仕様:
テストケースごとに、AとBの合計を入力と同じ形式で1行に出力する必要があります。各行の終わりに余分なスペースがあってはならないことに注意してください。小数点第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
アイデア
この質問も非常に単純です。これは、インデックスが[0,1000]に厳密に従うため、インデックスのサイズに従って出力も出力されるため(ここでは逆順であることに注意してください)、配列の添字を直接使用してインデックスを表します。値は係数が格納されることを表し、nとanが読み込まれるたびに(nは指数、anは係数)、対応するp [n] + = anが与えられます。ゼロ以外の項目を表すため、cnt ++(すべてのゼロ以外の項目の合計数が最後に出力されるため)、最後に配列を逆方向にたどってインデックスと係数を出力します。
時間のかかる作業を最小限に抑えるため、読み取り時に最高のインデックスを記録することをお勧めします(ここではmaxiを使用しました)。これにより、i = 0が配列の出力を逆の順序で走査するまで、i = maxiを直接使用します。
コード
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
const int maxn = 1001;
double p[maxn]={0};//初始化所有系数是0
int main(){
int maxi = 0;
int k1;
scanf("%d", &k1);
while(k1--){
int n;
double an;
scanf("%d%lf", &n, &an);
p[n] += an;//下标是指数,值是系数
if(n>maxi) maxi = n;
}
int k2;
scanf("%d", &k2);
while(k2--){
int n;
double an;
scanf("%d%lf", &n, &an);
p[n] += an;
if(n>maxi) maxi = n;
}
int cnt = 0;
for(int i=0;i<=maxi;i++){
if(p[i]!=0) cnt++;
}
printf("%d", cnt);
for(int i=maxi;i>=0;i--){
if(p[i]!=0){
printf(" %d %.1f", i, p[i]);
}
}
return 0;
}