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;
}
浙公网安备 33010602011771号