题目
(个人向)一道利用map/multimap/pair和格式化输出的题
1002 A+B for Polynomials[PAT (Advanced Level) Practice]
平台不知道为什么没有提供MarkDown,所以我截图一下.
输入输出样例
---------------------------------------------------------分割线---------------------------------------------------------
CODE
//给个免费的赞吧谢谢ヽ( ̄ω ̄( ̄ω ̄〃)ゝ
#include<bits/stdc++.h>
using namespace std;
int insertKey(multimap<double,double,greater<double>>&mm,pair<double,double>pp){
if(pp.second==0)return 0;
if(mm.find(pp.first)==mm.end()){
mm.insert(pp);
}else{
mm.find(pp.first)->second+=pp.second;
if(mm.find(pp.first)->second==0)mm.erase(pp.first);
}
}
int main(){
int line1,line2;
multimap<double,double,greater<double>>mmap;
cin>>line1;
for(int i=0;i<line1;++i){
double exponents,coefficients;//指数,系数
cin>>exponents>>coefficients;
insertKey(mmap,make_pair(exponents,coefficients));
}
cin>>line2;
for(int i=0;i<line2;++i){
double exponents,coefficients;
cin>>exponents>>coefficients;
insertKey(mmap,make_pair(exponents,coefficients));
}
cout<<mmap.size();
for(const auto& x:mmap){
if(x.second!=0)
cout<<" "<<x.first<<" "<<fixed<<setprecision(1)<<x.second<<fixed<<setprecision(0);
}
return 0;
}
NOTE
/*
此处我选择了multimap,当然map是再好不过的,主要是刚复习到这里.map实现的关键插入如下:
hash[key] += val;
其中
map<key,value>hash可以实现一个hash表(可以理解为)
然后对于map而言,其下标访问[key],若key在map中,则返回该元素
重点:
如果不存在,则会自动创建该key值的一个pair在map/multimap中.
所以很好实现哈希表啊,将其看作一个桶,我只要扔了就必然在一个桶里,如果没有桶就会自动生成一个桶对应我扔出的pair的key.
*/
//对于multimap,需要引用承接,然后对于pair,其实我们可用const&承接,不修改的同时节省副本空间
int insertKey(multimap<double,double,greater<double>>&mm,pair<double,double>pp){
if(pp.second==0)return 0;
if(mm.find(pp.first)==mm.end()){//如果pair的key在multimap中不存在,则直接插入
mm.insert(pp);
}else{//如果存在,则将second(value)插到对应key的value中.
//提出疑问:书上这样写的好像仅有const和unordered型map和multimap可以at()和subscript下标[],但是实际上不是这样似乎.
//multimap/map访问具体元素:
//1 *(multimap.find(key)).
//2 multimap.find(key)->
mm.find(pp.first)->second+=pp.second;
if(mm.find(pp.first)->second==0)mm.erase(pp.first);//因为依赖于size()统计有效的个数,故对于此处:同指数(key)的项,其当前系数经过此轮加减后变为0,则系数为0需要立刻删除,回收空间,避免被size(),因为我们size()用于逻辑上的有效项数统计.
}
}
...
double exponents,coefficients;//指数,系数
...
insertKey(mmap,make_pair(exponents,coefficients));//传入multimap和键值对
}
cout<<mmap.size();
//采用size()统计不为零的项个数,所以必须要求multimap必须存放的是有价值的东西,没有价值的必须马上删掉(比如项为0的情况),这在我自己写的函数里面体现.
for(const auto& x:mmap){
//const auto&:const用于限制污染数据,auto用于智能承接,&引用用于不让它开副本,节省空间
if(x.second!=0)//系数为0的,自然项也为0,不必输出
cout<<" "<<x.first<<" "<<fixed<<setprecision(1)<<x.second<<fixed<<setprecision(0);
//<<fixed<<setprecision(1)<<????????????<<fixed<<setprecision(0);
//同一输出流中,为了使格式化输出不污染下一次输出流,以setprecision(0)结尾
//<int,double>就不需要这个样子,因为我是<double,double>,懒得改了过了就行
...