因为最近在刷题库,想想就把本人可以想到的解法写到博客里,作为整理归纳。未必是最优解,还请各位高手多多包涵,能够指点指点。
题目要求
1002 A+B for Polynomials (25 分)
This time, you are supposed to find A+B where A and B are two polynomials.
Input Specification:
Output Specification:
For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.
Sample Input:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample Output:
3 2 1.5 1 2.9 0 3.2
解题思路1
采用数组解决
注意事项1
代码部分1
#include<stdio.h>
#include<stdlib.h>
main(){
float A[1001]={0.0};
int num,x;
double y;
//第一个多项式读入
scanf("%d",&num);
for(int i =0;i<num;i++){
scanf("%d",&x);
scanf("%lf",&y);
A[x]+=y;
}//for
//第二个多项式读入
getchar();
scanf("%d",&num);
for(int i =0;i<num;i++){
scanf("%d",&x);
scanf("%lf",&y);
A[x]+=y;
}//for
num =0;
for(int i=1000;i>=0;i--){
if(A[i]!=0.0)
num++;
} //统计总数
printf("%d",num );
for(int i =1000;i>=0;i--){
if(A[i]!=0){
printf(" %d",i);
printf(" %.1lf",A[i]);
}
} //打印数据
}
运行结果1
解题思路2
采用map解决
注意事项2
代码2
#include<stdio.h>
#include<stdlib.h>
#include<map>
using namespace std;
main(){
map<int,double> mp;
int num,x;
double y;
//第一个多项式读入
scanf("%d",&num);
for(int i =0;i<num;i++){
scanf("%d",&x);
scanf("%lf",&y);
mp[x]+=y;
}//for
//第二个多项式读入
getchar();
scanf("%d",&num);
for(int i =0;i<num;i++){
scanf("%d",&x);
scanf("%lf",&y);
mp[x]+=y;
}//for
num =mp.size(); //统计总数
map<int,double>::iterator it=mp.begin();
for(;it!=mp.end();it++){
if(it->second==0.0&&it->second==-0.0) num--;
}
printf("%d",num );
it=(mp.end());
it--;
for(;it!=mp.begin();it--){
if(it->second!=0.0&&it->second!=-0.0)
printf(" %d %.1lf",it->first,it->second);
}
it=mp.begin();
if(it->second!=0.0&&it->second!=-0.0)
printf(" %d %.1lf",it->first,it->second);
//打印数据
}
运行结果2
从运行结果上来看,map的运行速度确实是比数组更慢,原则上应该是优先使用数组,map使用容易超时。