P=A+B A,B,P=【k e c e c ec】
#include <iostream>
#include <iomanip>
#include <vector>
#include <stdio.h>
using namespace std;
class Term {
public:
int e;
double c;
Term() {}
Term(int ee, double cc) {
e = ee;
c = cc;
}
};
int main()
{
vector<Term> sum;
int n1, n2;
cin >> n1;
vector<Term> a(n1);
for (vector<Term>::iterator it = a.begin(); it != a.end(); it++) {
cin >> it->e;
cin >> it->c;
}
cin >> n2;
vector<Term> b(n2);
for (vector<Term>::iterator it = b.begin(); it != b.end(); it++) {
cin >> it->e;
cin >> it->c;
}
if (n1 < n2)
n1 = n2;
sum.reserve(n1);
vector<Term>::iterator ita = a.begin(), itb = b.begin();
for (; ita != a.end() && itb != b.end(); ) {
if (ita->e == itb->e) {
double dd = ita->c + itb->c;
if (dd != 0) {
sum.push_back(Term(ita->e, dd));
}
ita++;
itb++;
}
else if (ita->e > itb->e) {
sum.push_back(Term(ita->e, ita->c));
ita++;
}
else {
sum.push_back(Term(itb->e, itb->c));
itb++;
}
}
for (; ita != a.end(); ita++) {
sum.push_back(Term(ita->e, ita->c));
}
for (; itb != b.end(); itb++) {
sum.push_back(Term(itb->e, itb->c));
}
cout << sum.size();
for (vector<Term>::iterator it = sum.begin(); it != sum.end(); it++) {
cout << " " << it->e << " " << fixed << setprecision(1) << it->c;
}
return 0;
}
使用 map:
#include <iostream>
#include <iomanip>
#include <vector>
#include <stdio.h>
#include <map>
using namespace std;
int main()
{
map<int, double,greater<int>> p;//声明一个map,键类型是int,值类型是double,比较器是> ,因而降序
int n1, n2;
cin >> n1;
int e;
double c;
for (int i = 0 ; i< n1; i++) {
cin >> e;
cin >> c;
p[e] = c;//插入一个键是e,值是c的元素到相容容器p中
}
cin >> n2;
for (int i = 0; i < n2; i++) {
cin >> e;
cin >> c;
if (p.find(e) != p.end()) {//检查键是e的元素是不是存在容器中。不能使用 p[e],因为这样操作会生成一个值为零的新元素
double sum = p[e] + c;//存在的话就与原来的元素相加
if (sum == 0) {
p.erase(e);//算出来的和为零,该项系数为零,删除
}else {
p[e] = sum;//更新该项的值
}
}else {
p[e] = c;//不存在,插入新元素
}
}
cout << p.size();
for (map<int, double>::iterator it = p.begin(); it != p.end(); it++) {//遍历输出
cout << " " << it->first << " " << fixed << setprecision(1) << it->second;
}
return 0;
}