PAT (Advanced Level) Practice 1002 A+B for Polynomials (25 分) 凌宸1642

PAT (Advanced Level) Practice 1002 A+B for Polynomials (25 分) 凌宸1642

题目描述:

This time, you are supposed to find A+B where A and B are two polynomials.

译:这一次,你要找到 A + B ,其中 A , B 是两个多项式


Input Specification (输入说明):

Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N1 aN1 N2 aN2 ... NK aNK

where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1,2,⋯,K) are the exponents and coefficients, respectively. It is given that 1 ≤ K ≤ 100 ≤ NK < ⋯ < N2 < N1 ≤ 1000.

译:每个输入文件包含一个测试用例,每个用例占两行,每行包含多项式的如下信息 : K N1 aN1 N2 aN2 ... NK aNKk是多项式中非零项的个数,NiaNi (i=1,2,⋯,K) 分别表示多项式的 指数 和 系数。 已知 1 ≤ K ≤ 100 ≤ NK < ⋯ < N2 < N1 ≤ 1000.


Output Specification (输出说明):

For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.

译:对于每个测试用例,你应该在一行中输出 A + B 的和,和输入具有相同的格式。注意:在行末不能有多与的空格,并且精确到1位小数。


Sample Input (样例输入):

2 1 2.4 0 3.2
2 2 1.5 1 0.5

Sample Output (样例输出):

3 2 1.5 1 2.9 0 3.2

The Idea:

/*
	(1) 对于多项式的存储,由于每一个指数 int 型对应有一个系数 double 型 ,故利用 map ,
		由于输出的时候需要按照系数从大到小的输出,所以利用 按照 key 的值降序排列的 map 结构。
*/
	map<int , double , greater<int> > mp;

/*
	(2) 但是值得注意的是:题目中说明是非零项的个数,那么很有可能在相加的时候出现系数为 0 的时候
		这种时候显然这一项已经不符合我们的要求。
		为此我再设立了一个 map 用来存储满足要求的答案
*/

The Codes:

#include<bits/stdc++.h>
using namespace std ;
map<int , double , greater<int> > mp ;// 储存最初 A + B 的和 ,默认排序方式为 key 的降序
map<int , double , greater<int> > ans ; // 储存本题 A + B 的和 ,默认排序方式为 key 的降序
int main(){
	int k1 , k2 , n ;
	double an ;
	cin >> k1 ; // 输入 A 的非零项数 以及每一项的 指数 和 系数
	for(int i = 0 ; i < k1 ; i ++){
		cin >> n >> an ; 
		mp[n] += an ; // 以指数为 key ,输入的 值 增加到 value 上
	} 
	cin >> k2 ; // 输入 B 的非零项数 以及每一项的 指数 和 系数
	for(int i = 0 ; i < k2 ; i ++){
		cin >> n >> an ;
		mp[n] += an ; // 以指数为 key ,输入的 值 增加到 value 上
	} 
	for(map<int,double,greater<int> >::iterator it =mp.begin() ; it != mp.end() ;it ++)
		if(fabs((*it).second ) >  1e-6) // 浮点数,判断是否 系数相加之后 为 0
            ans[(*it).first] = (*it).second ;// 非零项用 ans 存储
	cout << ans.size() ; // 输出 A + B 的和 非零项数
	for(map<int,double,greater<int> >::iterator it =ans.begin();it != ans.end();it++){
		//cout<<" "<<(*it).first<<" "<<(*it).second;
		printf(" %d %.1f",(*it).first,(*it).second);
	}
	cout << endl ; // 行尾换行符
	return 0;
}

posted @ 2021-03-30 20:10  凌宸1642  阅读(43)  评论(0编辑  收藏  举报