原题
题目大意及思路
这里是将两行多项式同类项合并,我是选取了map结构来存放,将指数作为键,系数作为值。在输入数据的同时将map里的数据进行处理。
但这里有个很关键的点:若两项相加为0的话,就不予以输出,同时项数也要减去相应数量。
代码
#include<iostream>
#include<map>
using namespace std;
int main(){
map<int,double,greater<int>> m;
int k1,k2;
cin>>k1;
for(int i=0;i<k1;i++){
int e;double c;
cin>>e>>c;
m[e]=c;
}
cin>>k2;
int cus=0;
for(int i=0;i<k2;i++){
int e;double c;
cin>>e>>c;
m[e]+=c;
if(m[e]==0) cus++;
}
printf("%d",m.size()-cus);
for(auto it=m.begin();it!=m.end();it++){
if(it->second!=0) printf(" %d %.1f",it->first,it->second);
}
return 0;
}
运行截图
收获
- map原本是按键值从小到大排序,如果需要按键从小到大排序的话:
map<int,double,greater<int>> m;
若是自己重新定义一个比较函数:(以下参考这里)
//先定义比较函数
struct CmpByKeyLength {
bool operator()(const string& k1, const string& k2) {
return k1.length() < k2.length();
}
};
//在主函数定义map时加入比较函数
map<string, int, CmpByKeyLength > mapStudent;
map里键为结构体
typedef struct tagStudentInfo
{
int iID;
string strName;
bool operator < (tagStudentInfo const& r) const {
//自定义比较函数
if(iID < r.iID) return true;
if(iID == r.iID) return strName.compare(r.strName) < 0;
return false;
}
}StudentInfo;
//定义
map<StudentInfo, int>mapStudent;