这个有点坑的就是当结果多项式为0的时候要输出 0 0 0 和前面A+B多项式一样要精确到一位小数。
更新:case里面没有为空的情况之前分析错了。
主要问题在于case 0中有和为0的情况 会导致计数出问题。代码已经更新
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <stack>
#define MAX 100010
using namespace std;
struct node{
int k;
float na;
};
vector <node> p1;
float ans[MAX];
bool isVis[MAX];//统计数目
int sum = 0;
int n;
int main(){
memset(ans,0,sizeof(ans));
memset(isVis,false,sizeof(isVis));
scanf("%d",&n);
node t;
for(int i = 0;i < n ;i++){
scanf("%d%f",&t.k,&t.na);
p1.push_back(t);
}
scanf("%d",&n);
for(int i = 0;i < n ;i++){
scanf("%d%f",&t.k,&t.na);
for(int j = 0 ; j < p1.size() ;j++){
int k = t.k + p1[j].k;
ans[k] += t.na * p1[j].na;
if(ans[k] == 0 && isVis[k]){//排除和为0
isVis[k] = false;
sum--;
}
if(!isVis[k] && ans[k]){
sum++;
isVis[k] = true;
}
}
}
printf("%d",sum);
vector <node> ans2;
for(int i = MAX - 1 ;i >= 0 ;i--){
if(ans[i] != 0){
printf(" %d %.01f",i,ans[i]);
}
}
return 0;
}