PATグレードAブラシテストレコード-1002 A + B(多項式)(25ポイント)

今回は、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;
}
元の記事を54件公開 27 件を獲得 4972件を表示

おすすめ

転載: blog.csdn.net/weixin_42257812/article/details/105589372