我愣是没看懂给的公式是个啥意思,英文也有几个不认识的……好傻我……
题意
给出两行数,
每行数首先给出一个 (N) ,表示接下去有 (N) 对数。
每一对数给出 (a) 和 (b),分别代表 指数 和 系数,
求这两行的和,即求所有项的和 -> 多项式的和。
输出要求:
项数 指数1 系数1 指数2 系数2……
(系数保留一位小数)
样例解释
题目给出:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
把所有的数据写成多项的形式:
2.4a^1 3.2a^0
1.5a^2 0.5a^1
所有项相加得:
2.4a+3.2+1.5a^2+0.5a
合并得:
2.9a+3.2+1.5a^2
指数从大到小排序后得:(共3项)
1.5a^2 2.9a^1 3.2a^0
注意
-
PS:系数为0的不要输出
-
mp.insert(make_pair("a",3)); = mp.insert(pair<string,int>("b",5));
-
map内部默认按照KEY值递增排序,本题需要递减,则定义map的时候写成以下代码即可。(我的补充里面有别的方法,但是我没看懂怎么使用)
map<int,double,greater<int>> mp; // 按KEY值递减插入数据
思路
-
注意一下本题map的写法和迭代器的使用即可。好久没用了。
-
输入a和b,a是int型指数,我们可以把它看做KEY,b是double型系数,我们可以把它看做VALUE,故map里面放的顺序应该是 int,double ,别搞错了。
AC代码
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
int main()
{
map<int,double,greater<int>> mp; // 按Key值递减插入数据
int n,a;
cin>>n;
double b; //b系数value double;a指数key int
for(int i=0;i<n;i++)
{
cin>>a>>b;
mp[a]+=b;
}
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a>>b;
mp[a]+=b;
}
// cout<<mp.size(); 排除系数为0的项
map<int,double>::iterator it; //遍历输出
int k=0;
for(it=mp.begin();it!=mp.end();it++)
if(it->second!=0)
k++;
cout<<k;
for(it=mp.begin();it!=mp.end();it++)
if(it->second!=0)
printf(" %d %.1lf",it->first,it->second);
cout<<endl;
return 0;
}
补充
关于STL自定义排序的博客:
结构体重载: