1、题目内容
This time, you are supposed to find A+B where A and B are two polynomials.
Input
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N1 aN1 N2 aN2 … NK aNK, where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1, 2, …, K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10,0 <= NK < … < N2 < N1 <=1000.
Output
For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.
Sample Input
2 1 2.4 0 3.2
2 2 1.5 1 0.5
1
2
Sample Output
3 2 1.5 1 2.9 0 3.2
2、做题思路
易错点:注意正负相抵的情况
方法1 :数组,类似于哈希
方法2 : map
注意读题,注意各参数的含义和范围
#include <iostream>
#include <map>
#include<stdio.h>
using namespace std;
int main() {
int m1 = 0;
int m2;
map<int, float> mp;
float c;
int index;
//读入数据
cin >> m1;
for(int i = 0; i < m1; i++) {
cin >> index;
cin >>c;
mp[index] = c;
}
cin >> m2;
for (int i = 0; i < m2; i++) {
cin >> index;
cin >> c;
if (mp.count(index) > 0) {
// 注意正负相抵的情况
if ((mp[index] + c) != 0) {
mp[index] = mp[index] + c;
}
else {
mp.erase(index);
m1--;
}
}
else {
mp[index] = c;
m1++;
}
}
printf("%d", m1);
map<int,float>::reverse_iterator it;
for (it = mp.rbegin(); it != mp.rend(); it++ ) {
printf(" %d %.1f", it->first, it->second);
}
return 0;
}
3、map基础知识
参考文档:map的插入、查找、删除https://blog.csdn.net/google19890102/article/details/51720305
补充:map的排序问题
map是自动按升序排列的,没有sort函数
用于迭代的:
c.begin() 返回一个迭代器,它指向容器c的第一个元素
c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置
c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素
c.rend() 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置
(https://blog.csdn.net/kjing/article/details/6936325)
上述每个操作都有两个不同的版本:一个是const成员,另一个是非const成员。这些操作返回什么类型取决于容器是否为const。如果容器不是const,则这些操作返回iterator或reverse_iterator类型。如果容器是const,则其返回类型要加上const_前缀,也就是const_iterator和const_reverse_iterator类型。
实例:
// map_rbegin.cpp
// compile with: /EHsc
#include <map>
#include <iostream>
int main( )
{
using namespace std;
map <int, int> m1;
map <int, int> :: iterator m1_Iter; //用于正序
map <int, int> :: reverse_iterator m1_rIter; //用于逆序
map <int, int> :: const_reverse_iterator m1_crIter; //const
typedef pair <int, int> Int_Pair;
m1.insert ( Int_Pair ( 1, 10 ) );
m1.insert ( Int_Pair ( 2, 20 ) );
m1.insert ( Int_Pair ( 3, 30 ) );
m1_rIter = m1.rbegin( );
cout << "The first element of the reversed map m1 is "
<< m1_rIter -> first << "." << endl;
// begin can be used to start an iteration
// through a map in a forward order
cout << "The map is: ";
for ( m1_Iter = m1.begin( ) ; m1_Iter != m1.end( ); m1_Iter++)
cout << m1_Iter -> first << " ";
cout << "." << endl;
// rbegin can be used to start an iteration
// through a map in a reverse order
cout << "The reversed map is: ";
for ( m1_rIter = m1.rbegin( ) ; m1_rIter != m1.rend( ); m1_rIter++)
cout << m1_rIter -> first << " ";
cout << "." << endl;
// A map element can be erased by dereferencing to its key
m1_rIter = m1.rbegin( );
m1.erase ( m1_rIter -> first );
m1_rIter = m1.rbegin( );
cout << "After the erasure, the first element "
<< "in the reversed map is "
<< m1_rIter -> first << "." << endl;
}
output :
The map is: 1 2 3 .
The reversed map is: 3 2 1 .
After the erasure, the first element in the reversed map is 2.
map的基本操作函数:
C++ Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
(参考至https://blog.csdn.net/aoshuang2145/article/details/102438738)