数组的最短距离
Sample Input
5 5
1 2 3 4 5
6 7 8 9 10
Sample Output
1
代码一:
#include<stdio.h> #include<math.h> int a[1003],b[1003],s[1003][1003]; int main() { int m,n,i,j; scanf("%d%d",&m,&n); for(i=1;i<=m;i++) scanf("%d",&a[i]); for(j=1;j<=n;j++)scanf("%d",&b[j]); for(i=1;i<=m;i++) for(j=1;j<=n;j++) s[i][j]=abs(a[i]-b[j]); int maxi=1,maxj=1; for(i=1;i<=m;i++) for(j=1;j<=n;j++) if (s[i][j]<s[maxi][maxj]) {maxi=i;maxj=j;} printf("%d/n",s[maxi][maxj]); return 0; }
代码二
#include<stdio.h> #include<math.h> int main() { int m,n,i,j,min; int a[1003],b[1003]; scanf("%d%d",&m,&n); for(i=1;i<=m;i++) scanf("%d",a+i); for(j=1;j<=n;j++) scanf("%d",b+j); min=abs(a[1]-b[1]); for(i=1;i<=m;i++) for(j=1;j<=n;j++) if (abs(a[i]-b[j])<min) min=abs(a[i]-b[j]); printf("%d/n",min); return 0; }
代码一的效率的原因 :把每一个a[i],b[i],a[i]-b[j]都存到了数组里
而实际 直接用max 和a[i]-b[j] 比较就可以了
代码三:进一步提高效率
#include<stdio.h> #include<stdlib.h> #include<math.h> int a[1003],b[1003],c[1003]; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int min(int a,int b) { return a<b?a:b; } int main() { int m,n,i,j; scanf("%d%d",&m,&n); for(i=1;i<=m;i++) scanf("%d",&a[i]); for(j=1;j<=n;j++)scanf("%d",&b[j]); for(i=1;i<=m;i++) { if (b[1]>a[m]) {c[i-1]=b[1]-a[m];continue;} else if (b[n]<a[1]) {c[i-1]=a[1]-b[n];continue;} for(j=1;j<=n-1;j++) { if (a[i]==b[j]) {printf("0/n");return 0;} if (b[j]<a[i]&&b[j+1]>a[i]) {c[i-1]=min(a[i]-b[j],b[j+1]-a[i]);break;} } } qsort(c,m,sizeof(c[0]),cmp); printf("%d/n",c[0]); return 0; }