PTA

我愣是没看懂给的公式是个啥意思,英文也有几个不认识的……好傻我……

题意

给出两行数,

每行数首先给出一个 (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

注意

  1. PS:系数为0的不要输出

  2.   mp.insert(make_pair("a",3));    =     mp.insert(pair<string,int>("b",5));
    
  3. map内部默认按照KEY值递增排序,本题需要递减,则定义map的时候写成以下代码即可。(我的补充里面有别的方法,但是我没看懂怎么使用)

    map<int,double,greater<int>> mp; // 按KEY值递减插入数据
    

思路

  1. 注意一下本题map的写法和迭代器的使用即可。好久没用了。

  2. 输入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自定义排序的博客:

结构体重载:

原文地址:https://www.cnblogs.com/OFSHK/p/14342151.html