2021/05/18 1002 A+B for Polynomials (25 分)

初看此题,当即想到用结构体表示各项的指数以及系数。
期间用了二分查找,快速排序(搞得自己很厉害一样)一顿操作猛如虎;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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值