#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
int main(){
int na, nb, exp, cnt = 0;
double coe;
cin >> na;
map<int, double> ma;
for(int i = 0; i < na; i++){
cin >> exp >> coe;
ma[exp] = coe;
}
cin >> nb;
map<int, double> mb;
for(int i = 0; i < nb; i++){
cin >> exp >> coe;
mb[exp] = coe;
}
map<int, double> ans;
// auto ita = ma.begin();
// auto itb = mb.begin();
// while(ita != ma.end()){
// while(itb != mb.end()){
// exp = ita->first + itb->first;
// coe = ita->second * itb->second;
// ans[exp] += coe;
// ++itb;
// }
// ++ita;
// }
for(auto ita:ma){
for(auto itb:mb){
exp = ita.first + itb.first;
coe = ita.second * itb.second;
ans[exp] += coe;
}
}
vector<int> v(ans.size());
for(auto it:ans) v[cnt++] = it.first;
sort(v.begin(), v.end());
cout << cnt;
for(cnt--; cnt >= 0; cnt--) printf(" %d %.1f", v[cnt], ans[v[cnt]]);
return 0;
}
第一个测试点没过,但思路可以,再次练习了map 和 vector 的使用方法。
其中有个致命的思考错误,相乘后是指数相加,所以直接开个2020的数组就可,开始尝试 a[1001001]就溢出了。
#include <iostream>
using namespace std;
int main(){
int na, nb, exp, cnt = 0;
double coe, a[1010]={0}, b[1010]={0}, ans[2020]={0};
cin >> na;
for(int i = 0; i < na; i++){
cin >> exp >> coe;
a[exp] = coe;
}
cin >> nb;
for(int i = 0; i < nb; i++){
cin >> exp >> coe;
b[exp] = coe;
}
for(int i = 0; i < 1010; i++){
for(int j = 0; j < 1010; j++){
ans[i + j] += a[i] * b[j];
}
}
for(int i = 2019; i >= 0; i--)
if(ans[i]) cnt++;
cout << cnt;
for(int i = 2019; i >= 0; i--)
if(ans[i]) printf(" %d %.1f", i, ans[i]);
return 0;
}