做题思路:
要求两个多项式相加,结果按照指数从大到小的顺序输出。可以运用map离散化指数,使得每个指数相同的数的系数相加,最后排序输出结果就好。我这里处理的是多组输入,不用多组输入也可以过。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
const int N = 1010;
map<int, int> S;
int n, m, idx;
struct Node{
int num;
double val;
}nod[N];
int get(int x)
{
if(S.count(x) == 0) S[x] = ++ idx;
return S[x];
}
int cmp(Node a, Node b)
{
return a.num > b.num;
}
int main()
{
while(~scanf("%d", &n))
{
idx = 0;
S.clear();
memset(nod, 0, sizeof nod);
for(int i = 1; i <= n; i ++ )
{
int a, t;
double b;
scanf("%d%lf", &a, &b);
t = get(a);
nod[t].num = a, nod[t].val += b;
}
scanf("%d", &m);
for(int i = 1; i <= m; i ++ )
{
int a, t;
double b;
scanf("%d%lf", &a, &b);
t = get(a);
nod[t].num = a, nod[t].val += b;
}
sort(nod + 1, nod + idx + 1, cmp);
int cnt = idx;
bool st[1010];
memset(st, 0, sizeof st);
for(int i = 1; i <= idx; i ++ )
if(nod[i].val == 0) st[i] = 1, cnt -- ;
printf("%d", cnt);
for(int i = 1; i <= idx; i ++ )
{
if(st[i] == 1) continue;
if(i != idx)
printf("% d %.1lf", nod[i].num, nod[i].val);
else printf(" %d %.1lf", nod[i].num, nod[i].val);
}
cout << "\n";
}
return 0;
}