1002 A+B for Polynomials[PAT (Advanced Level) Practice]

2 篇文章 0 订阅
2 篇文章 0 订阅

题目

(个人向)一道利用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>,懒得改了过了就行
...
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值