uva10487 - Closest Sums

又是一个水题,但是吧,自己写的代码还是不够高效。

思路,把所有的两数之和存到数组里,然后排序+二分查找。

这应该是通用思路吧,反正见到老多人的代码都是跑了200+ms。

后来看了一个跑了64ms的代码,我才明白,自己的代码排序很耗时的,,,,,,

先贴一下自己的代码:

#include <cstdio>
#include <cstdlib>
const int M = 1000/2*(1000+1)+10;
int st[M], a[1010], c;
int comp(const void*a, const void *b)
{
    return *(int*)a - *(int*)b;
}
int bina_search(int aim)
{
    int l = 0, r = c, m;
    while(l<r)
    {
        m = l + (r-l)/2;
        if(aim==st[m]) return m;
        else if(aim<st[m]) r = m;
        else l = m+1;
    }
    return l;
}
int main ()
{
    int n, m, cas = 0;
    while(scanf("%d",&n)&&n)
    {
        int tt, po, L, R; c = 0;
        for(int i = 0; i < n; i++) scanf("%d",&a[i]);
        for(int i = 0; i < n; i++) for(int j = i+1; j < n; j++)
        st[c++] = a[i]+a[j];
        qsort(st,c,sizeof(st[0]),comp);
        scanf("%d",&m);
        printf("Case %d:\n",++cas);
        for(int i = 0; i < m; i++)
        {
            scanf("%d",&tt);
            po = bina_search(tt);
            if(st[po]==tt||po==0||po==c) {printf("Closest sum to %d is %d.\n",tt,po==c?st[c-1]:st[po]); continue; }
            L = tt-st[po-1];    R = st[po]-tt;
            printf("Closest sum to %d is %d.\n",tt,L>R?st[po]:st[po-1]);
        }
    }
    return 0;
}

大牛的代码:

#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}
int a[1004];
int main()
{
	int n,m,ncase=0,i,j;
	int x,min,ans,pre;
	while(scanf("%d",&n) && n)
	{
		printf("Case %d:\n",++ncase);
		for(i=0;i<n;i++) scanf("%d",&a[i]);
		qsort(a,n,sizeof(a[0]),cmp);
		scanf("%d",&m);
		while(m--)
		{
			scanf("%d",&x);
			min=0x7fffffff;
			for(i=0;i<n;i++)
			{
				pre=0x7fffffff;
				for(j=i+1;j<n;j++) 
				{
					if(abs(a[i]+a[j]-x)>pre) break;
					pre=abs(a[i]+a[j]-x);
					if(a[i]!=a[j] && pre<min)
						min=abs((ans=a[i]+a[j])-x);
				}
			}
			printf("Closest sum to %d is %d.\n",x,ans);
		}
	}
	return 0;
}



你可能感兴趣的:(uva10487 - Closest Sums)