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; }