PAT 1002 A+B for Polynomials

PAT 1002 A+B for Polynomials

题目含义

就是两个指数多项式相加,然后输出结果。

结果第一个数是多项式中元素的个数,然后就是按照指数从大到小输出各个元素。

题解

这里需要注意的是第一个数的输出。联系常识,如果两个数相加为0,那么是不需要输出的,所以元素的个数有可能会比输入的要少。

还有就是注意输入的指数是从大到小的,也就是单看每一个输入都是有序的。这里的相加相当于广义上的两个有序序列合并起来。

网上题解很多,但是很少使用链表这种数据结构来解决,其实使用链表是比较合适的。把第一个序列固定,第二个遍历插入到第一个序列中即可。

这里为了方便,使用了STL中的list。这也是我第一次使用list,其实还是蛮好用的。

好的数据结构能省很多事。

代码

对于列表主要就是看如何插入和删除。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<sstream>
typedef long long ll;
using namespace std;
const double eps=1e-6;
const int inf=0x3f3f3f3f;
const int MAXN=1E1+7;
struct Node{
	int n;
	double a;
}; 
typedef list<Node> lnd;
lnd nodes;
int n, k;

int main()
{
	cin>>k;
	Node tmp;
	for(int i=0; i<k; i++){
		scanf("%d%lf", &tmp.n, &tmp.a);
		nodes.push_back(tmp);
	}

//	for(lnd::iterator i = nodes.begin(); i!=nodes.end(); i++){
//		cout<<(*i).n<<" "<<(*i).a<<endl;
//	}
	
	cin>>k;
	lnd::iterator rs = nodes.begin();
	for(int i=0; i<k; i++){
		scanf("%d%lf", &tmp.n, &tmp.a);
		for(;; rs++){
			if(rs==nodes.end()){
				nodes.insert(rs, tmp);
				break;
			}
			if((*rs).n==tmp.n){
				(*rs).a += tmp.a;
				if((*rs).a==0.0)
					rs = nodes.erase(rs); //返回当前删除元素的下一个位置 
				break;
			}
			else if((*rs).n < tmp.n){
				lnd::iterator j = nodes.insert(rs, tmp); //insert函数是有返回值的,返回新插入的位置,就是rs的上一个位置。 
//				printf("%d *** %d\n", (*rs).n, (*j).n);
				break;
			} 
		}
	}
	n = nodes.size();
	cout<<n;
	lnd::iterator i = nodes.begin();
	while(i!=nodes.end()){
		printf(" %d %.1f", (*i).n, (*i).a);
		i++;
	}
	printf("\n");
	return 0;
}

PAT 1002 A+B for Polynomials

上一篇:redis哨兵


下一篇:php环境下nginx超时问题解决