PAT 甲级:1002 A+B for Polynomials,测试点说明

发布时间 2023-10-05 21:25:33作者: as阿水

 

1002 A+B for Polynomials  25分

题解:(类似于把两个多项式合并同类项:指数相同的项把系数相加),最后输出新多项式的项数、各项。

 

需要注意的测试点

1.输出的新项格式要与输入的一致:[项数] [指数1] [系数1] [指数2] [系数2] ...;且指数递减

2.指数是整型,系数是浮点型;且最后输出的系数保留一位小数

3.若指数为0系数不为0,该项是存在的,要输出该项;若系数为0,该项就是0了,无意义,不输出该项

4.若计算得到的新项项数为0,输出"0"即可,后面不要有空格

~~第一次提交时因为没有注意3、4,只得了17/25分,补上对3、4的处理即得满分。

 

题的做法:

1.首先要读懂题,没读懂题尤其不知道那两个单词exponent、cofficient的话,这是否有点...拔剑四顾心茫然/出师未捷身先死?

2.读懂题后还是比较简单的,说白了就是两个多项式相加得到新多项式。

3.因为指数的范围是有限的,且是对指数的系数相加,直接map[指数] += 系数即可。因为map是默认从小到大排列,这里将map->first放到vector<int>中sort(v.begin(),v.end(),greater<int>()),然后遍历vector,输出i和map[i]即可。第3步的处理和处理静态链表有点像,map+vector<map->first>这个组合好用极了。

 1 void ex1002(){
 2     int n1,n2,exponent;     // 项数、指数
 3     double coefficient;     // 系数
 4     map<int,double> mp;     // mp[指数] = 系数
 5     cin >> n1;
 6     for(int j=0;j<n1;j++){
 7         scanf("%d %lf",&exponent,&coefficient);
 8         mp[exponent] += coefficient;
 9     }
10     cin >> n2;
11     for(int j=0;j<n2;j++){
12         scanf("%d %lf",&exponent,&coefficient);
13         mp[exponent] += coefficient;
14     }
15     vector<int> v;
16     for(auto it=mp.begin();it!=mp.end();it++){
17         if(it->second != 0.0){      // 如果系数为0就不能作为输出项
18             v.push_back(it->first);
19         }
20     }
21     sort(v.begin(),v.end(),greater<int>());
22     cout << v.size();
23     if(v.size() ==0){
24         return;
25     }else{cout << " ";}     // 如果项数为0后面就不要加空格
26     for(int i=0;i<v.size();i++){
27         printf("%d %.1lf",v[i],mp[v[i]]);
28         if(i+1!=v.size()){
29             cout << " ";
30         }
31     }
32 }
33 
34 int main(){
35     ex1002();
36 
37     return 0;
38 }