简单模拟题,有一些坑点,代码和注释如下:
/*这一次,你应该找到A+B,其中A和B是两个多项式。
输入要求:
每个输入文件包含一个测试用例。每个案例占用2行,每行包含一个多项式的信息:
k N1 aN1 N2 aN2...Nn aNn(k为多项式的数量,N1表示指数,aN1表示系数)
输出:
对于每个测试用例都应该在一行中输出A和B的总和,格式与输入相同。请注意,每行末尾不得有额外的空间。请精确到小数点后1位。*/
#include <iostream>
#include <map>//用hash来存值
#include <vector>
#include <algorithm>
#include <iomanip>//解决保留一位小数
using namespace std;
struct h {
int zi;//指数
double xi;//系数
};
bool cmp(h a, h b) {
return a.zi > b.zi;
}
int main() {
map<int, double>q;
int k1, k2;
cin >> k1;
for (int i = 0; i < k1; i++) {
int zi;
double xi;
cin >> zi >> xi;
q[zi] = xi;
}
cin >> k2;
for (int i = 0; i < k2; i++) {
int zi;
double xi;
cin >> zi >> xi;
q[zi] += xi;
}
vector<h>s;
for (map<int, double>::iterator it = q.begin(); it != q.end(); it++) {
if (it->second != 0.0) {//不应该把系数为0的元素插入答案中,测试点3-6的原因
h tes;
tes.zi = it->first, tes.xi = it->second;
s.push_back(tes);
}
}
sort(s.begin(), s.end(), cmp);
cout << s.size() ;//服了,测试点6如果size=0,直接输出0;没有空格,直接移动到下面就行了,傻呗题目
for (int i = 0; i < s.size(); i++) {
if (i == 0)cout <<" "<< s[i].zi << " " << setiosflags(ios::fixed) << setprecision(1) << s[i].xi;//测试点2四舍五入保留一位小数
else cout << " " << s[i].zi << " " << setiosflags(ios::fixed) << setprecision(1) << s[i].xi;
}
cout << endl;
return 0;
}