题目大意:给定3个已排序的数列,在每个数列中选一个数,记为x,y,x,使(x-y)2+(y-z)2+(z-x)2最小。具体解法是贪心。
这题我无语了,就因为打错一个字母,WA了4次。还好在队友帮助下及时发现,否则还不知道要纠结多久……
下面的代码提交时需改数据类型,防止溢出。

1 #include <stdio.h> 2 #define MIN(a,b) ((a)<(b)?(a):(b)) 3 #define N 1000005 4 int a[N],b[N],c[N]; 5 int dist(int x,int y,int z) 6 { 7 return (x-y)*(x-y)+(y-z)*(y-z)+(z-x)*(z-x); 8 } 9 int main() 10 { 11 int la,lb,lc,i,j,k,min,t,ans; 12 int *p; 13 while(~scanf("%d%d%d",&la,&lb,&lc)) 14 { 15 for(i=0;i<la;i++) scanf("%d",&a[i]); 16 for(i=0;i<lb;i++) scanf("%d",&b[i]); 17 for(i=0;i<lc;i++) scanf("%d",&c[i]); 18 ans=dist(a[0],b[0],c[0]); 19 for(i=j=k=0;i+1<la||j+1<lb||k+1<lc;) 20 { 21 min=-1; 22 if(i+1<la) min=dist(a[i+1],b[j],c[k]),p=&i; 23 if(j+1<lb) 24 { 25 t=dist(a[i],b[j+1],c[k]); 26 if(min<0||t<=min) min=t,p=&j; 27 } 28 if(k+1<lc) 29 { 30 t=dist(a[i],b[j],c[k+1]); 31 if(min<0||t<=min) min=t,p=&k; 32 } 33 ans=MIN(min,ans); 34 (*p)++; 35 } 36 printf("%d\n",ans); 37 } 38 return 0; 39 }