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 }
标签:map,系数,PAT,测试点,输出,指数,Polynomials,mp,项数 From: https://www.cnblogs.com/jinziguang/p/17743940.html