PAT甲级1002
不得不说坑是真的多。。。 题目要求看似很简单,给出两个多项式,每一行第一个数字是非零项个数(项数),然后紧接每一项的幂和系数,要求进行简单的多项式合并。重点来了!!!
-
结果多项式要按幂从大到小排列,这个可能很多人会看出来,因为样例也是按幂从大到小排列。如果观察到这个规律,那算法可以用这样的:
while(i<n1 && j<n2){ if(s1[i].a>s2[j].a){ m[k].a=s1[i].a; m[k].b=s1[i].b; k++;i++; }else if(s1[i].a==s2[j].a){ if(s1[i].b+s2[j].b==0){ continue; }else{ m[k].a=s1[i].a; m[k].b=s1[i].b+s2[j].b; k++;i++;j++; } }else if(s1[i].a<s2[j].a){ m[k].a=s2[j].a; m[k].b=s2[j].b; k++;j++; } }
-
系数为零的项不输出!!!!反正我是没想到。。。。。。找bug找了很久
-
我还遇到了一个非常脑残的问题,两个多项式每个最多10项,加一起最多20项。。。但我最开始数组定义为10。。。以后数组尽量定义大一点。
-
好了格式问题,如果两个合并完为0,那么直接输出k,没有空格,以及最后一项最后不能有空格。
附代码:
#include<iostream>
using namespace std;
class t{
public:
int a;
double b;
};
int main(){
t s1[11],s2[11],m[22];
int n1,n2;
int i,j;
cin>>n1;
for(i=0;i<n1;i++){
cin>>s1[i].a;
cin>>s1[i].b;
}
cin>>n2;
for(i=0;i<n2;i++){
cin>>s2[i].a;
cin>>s2[i].b;
}
i=0;j=0;
int k=0;
while(i<n1 && j<n2){
if(s1[i].a>s2[j].a){
m[k].a=s1[i].a;
m[k].b=s1[i].b;
k++;i++;
}else if(s1[i].a==s2[j].a){
if(s1[i].b+s2[j].b==0){
j++;i++;
continue;
}else{
m[k].a=s1[i].a;
m[k].b=s1[i].b+s2[j].b;
k++;i++;j++;
}
}else if(s1[i].a<s2[j].a){
m[k].a=s2[j].a;
m[k].b=s2[j].b;
k++;j++;
}
}
if(i==n1){
for(j=j;j<n2;j++){
m[k].a=s2[j].a;
m[k].b=s2[j].b;
k++;
}
}
if(j==n2){
for(i=i;i<n1;i++){
m[k].a=s1[i].a;
m[k].b=s1[i].b;
k++;
}
}
if(k==0){
cout<<k;
}else{
cout<<k<<" ";
}
for(i=0;i<k-1;i++){
cout<<m[i].a<<" ";
printf("%.1f",m[i].b);
cout<<" ";
}
if(k>0){
cout<<m[k-1].a<<" ";
printf("%.1f",m[k-1].b);
}
}