https://pintia.cn/problem-sets/994805342720868352/problems/994805509540921344
题目
注意
- 相乘后可能会有的指数项常数为0,为零的需要刨除
- 因为A,B每项的系数范围为 0~1000 ,所以相乘后的系数范围在 0~2000
知识点
- 反向迭代器for(set::reverse_iterator t=ex.rbegin(); t!=ex.rend(); t++)
- set
- map
1.set的写法
指数写到setex中;系数写到str[1010]中
double str1[1010]= {},str2[1010]= {},str[2010]= {},y;
set<int>ex1;
set<int>ex2;
set<int>ex;
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-6;
int len1,len2,x;
int main() {
double str1[1010]= {},str2[1010]= {},str[2010]= {},y;
set<int>ex1;
set<int>ex2;
set<int>ex;
set<int>::iterator it;
set<int>::iterator jt;
//输入
scanf("%d",&len1);
for(int i=0; i<len1; i++) {
scanf("%d %lf",&x,&y);
str1[x]+=y;//系数
ex1.insert(x);//指数添加
}
scanf("%d",&len2);
for(int i=0; i<len2; i++) {
scanf("%d %lf",&x,&y);
str2[x]+=y;
ex2.insert(x);
}
//A*B
for(it=ex1.begin(); it!=ex1.end(); it++) {
for(jt=ex2.begin(); jt!=ex2.end(); jt++) {
ex.insert(*it+*jt);
str[*it+*jt]+=str1[*it]*str2[*jt];
if(fabs(str[*it+*jt])<eps)//如果相乘后该项系数为0则删除
ex.erase(*it+*jt);
}
}
//输出
printf("%d",ex.size());
if(ex.size())
for(set<int>::reverse_iterator t=ex.rbegin(); t!=ex.rend(); t++)
printf(" %d %.1lf",*t,str[*t]);
printf("\n");
return 0;
}
2.map的写法(比set更好)
map适合写两个数相互映射的数组的题目
比如说这一题就是,指数是唯一的,每一个指数都和相应的系数相映射
map<指数(键),系数(值)>,按键从小到大排序
map<int,double>A;
map<int,double>B;
map<int,double>str;
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-6;
int main() {
int len1,len2,x;
double y;
map<int,double>A;//<指数(键),系数(值)>,按键从小到大排序
map<int,double>B;
map<int,double>str;
//输入
scanf("%d",&len1);
for(int i=0; i<len1; i++) {
scanf("%d %lf",&x,&y);
A[x]+=y;
}
scanf("%d",&len2);
for(int i=0; i<len2; i++) {
scanf("%d %lf",&x,&y);
B[x]+=y;
}
//A*B
map<int,double>::reverse_iterator it;
map<int,double>::reverse_iterator jt;
for(it=A.rbegin(); it!=A.rend(); it++) {
for(jt=B.rbegin(); jt!=B.rend(); jt++) {
str[it->first+jt->first]+=it->second*jt->second;
if(fabs(str[it->first+jt->first])<eps)//如果相乘后该项系数为0则删除
str.erase(it->first+jt->first);
}
}
//输出
printf("%d",str.size());
for(it=str.rbegin(); it!=str.rend(); it++)
printf(" %d %.1lf",it->first,it->second);
printf("\n");
return 0;
}