在失败了50次之后,终于在光棍节这一天AC了!因为这还错过了联谊会,想想还真是diao丝啊
其实这个题做出来之后想想还真不算是难题,之前想复杂了。《数据结构与算法分析——C语言描述》3.2 节"The List ADT" 就是以多项式加法为例子讲解的List的应用。
我最开始写的答案思路是:将每一组的两个多项式的系数和幂数,分别保存到两个结构体数组_array1和_array2中,一组输入完后利用quick sort对_array2 ,_array2分别按照幂数从大到小排序。排序之后根据归并排序的思路来计算多项式的和,将结果保存到二维数组中。当输入结束再输出结果。不过那个程序里有个错误是对题目中的条件“为了标记每行多项式的结束,在表达式后面加上了一个幂数为负数的整数对"理解有误,我以为负幂数一定是在每一行的最后,但实际上负幂数可以出现在每一行的任何位置,负幂数之后的数据不可以参与计算。将这一点修改之后程序就可以正确运行了,但是提交之后会提示“Time Lmit Exceeded",就是当输入数据较大时程序执行时间太长,说明我的这个算法还是有很大缺陷的。
后来减小运行时间,采用了《数据结构与算法分析》里的第一个利用数组的思路,确实很快,但是需要占用很大内存,提交后会提示“Runtime Error"。最后就采用了最直接的方法:利用链表,解决问题。
#include <iostream> using namespace std; class Node{ public: Node *next_; int coeff_; int power_; }; class List{ public: List(void) { head_=new Node; head_->next_=NULL; } ~List(void) { delete head_; } void Insert(int coeff ,int power){ Node *pnode = head_; while( pnode->next_ != NULL && pnode->next_->power_ > power ){ pnode = pnode->next_; } if ( pnode->next_!=NULL && pnode->next_->power_ == power ){ pnode->next_->coeff_ += coeff; }else{ Node *nnode = new Node; nnode->coeff_ = coeff; nnode->power_ = power; nnode->next_ = pnode->next_; pnode->next_ = nnode; } } void Output(void) { Node *pnode = head_->next_; while( pnode != NULL ){ if ( pnode->coeff_ != 0 ) cout << "[ " << pnode->coeff_ << " " << pnode->power_ << " ] " ; pnode = pnode->next_; } cout << endl; } private: Node *head_; }; List *_list; int main(void){ int i,j; int num, coeff, power; string s; cin >> num; _list = new List [num]; for ( i=0; i<num; i++ ){ cin >> coeff >> power; while( power >= 0 ){ _list[i].Insert(coeff,power); cin >> coeff >> power; } getline(std::cin, s); cin >> coeff >> power; while( power >= 0 ){ _list[i].Insert(coeff,power); cin >> coeff >> power; } getline(std::cin, s); } for ( i=0; i<num; i++ ) _list[i].Output(); delete[] _list; }