初看此题,当即想到用结构体表示各项的指数以及系数。
期间用了二分查找,快速排序(搞得自己很厉害一样)一顿操作猛如虎;90+行代码一气呵成。
采用非常笨的方法,贴出来也是为了警醒自己。。
#include<stdio.h>
#include<stdlib.h>
struct nums{
int zhi,x_zhi;
double xi,x_xi;
int ret;
};
int cmp(const void *a,const void *b) //快速排序
{
struct nums *pa,*pb;
pa=(struct nums*)a;
pb=(struct nums*)b;
return (*pb).zhi-(*pa).zhi;
}
int find(struct nums *a,int key,int left,int mid,int right) //二分查找
{
if(left>right||mid<left||mid>right)
{
return -1; //没找到
}
else if(key==a[mid].zhi)
{
return mid;
}
else if(key>a[mid].zhi)
{
right=mid-1;
mid=(left+right)/2;
find(a,key,left,mid,right);
}
else if(key<a[mid].zhi)
{
left=mid+1;
mid=(left+right)/2;
find(a,key,left,mid,right);
}
}
int main()
{
struct nums a[10],b[10],c[20];
int k1,k2,i,cnt=0,key,flag;
scanf("%d",&k1);
for(i=0;i<k1;i++)
scanf("%d %lf",&a[i].zhi,&a[i].xi);
scanf("%d",&k2);
for(i=0;i<k2;i++)
scanf("%d %lf",&b[i].zhi,&b[i].xi);
qsort(a,k1,sizeof(a[0]),cmp);
qsort(b,k2,sizeof(b[0]),cmp);
for(i=0;i<k2;i++)
{
flag=find(a,b[i].zhi,0,(k1-1)/2,k1-1);
if(flag!=-1)
{
a[flag].ret=1;
a[flag].x_xi=b[i].xi;
a[flag].x_zhi=b[i].zhi;
b[i].ret=1;
}
}
for(i=0;i<k1;i++)
{
if(a[i].ret!=1)
{
c[cnt].zhi=a[i].zhi;
c[cnt].xi=a[i].xi;
cnt++;
}
}
for(i=0;i<k2;i++)
{
if(b[i].ret!=1)
{
c[cnt].zhi=b[i].zhi;
c[cnt].xi=b[i].xi;
cnt++;
}
}
i=0;
while(a[i].ret==1&&i<k1)
{
c[cnt].xi=a[i].xi+a[i].x_xi;
c[cnt].zhi=a[i].x_zhi;
cnt++;i++;
}
if(cnt==1&&c[0].xi==0&&c[0].zhi==0)
{
printf("0");
return 0;
}
qsort(c,cnt,sizeof(c[0]),cmp);
printf("%d",cnt);
for(i=0;i<cnt;i++)
printf(" %d %.1f",c[i].zhi,c[i].xi);
return 0;
}
提交的时候却只拿了19分。百思不得其解的时候查找大神的代码。
找到了一篇短短25行的题解,该大神的思路特别精彩;膜拜。。
原来不是问题复杂,而是自己把它想复杂了。从此拒绝一切花里胡哨。。
思路:
定义一个单精度ans数组大小为[1010],它的下标i即为指数,它本身ans[i]的值即为系数
输入两个多项式时,输入指数zhi 系数xi;
只要令ans[zhi]+=xi即可得到最终答案。
下面是完整代码:
#include<stdio.h>
int main()
{
int i,k,zhi,cnt=0;
double ans[1010]={0};
double xi;
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%d %lf",&zhi,&xi);
ans[zhi]+=xi;
}
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%d %lf",&zhi,&xi);
ans[zhi]+=xi;
}
for(i=0;i<1010;i++)
{
if(ans[i]!=0)
cnt++;
}
printf("%d",cnt);
for(i=1009;i>=0;i--)
{
if(ans[i]!=0)
printf(" %d %.1f",i,ans[i]);
}
return 0;
}