COJ1165(Nearest Numbers)

题目链接

题目大意:给定3个已排序的数列,在每个数列中选一个数,记为x,y,x,使(x-y)2+(y-z)2+(z-x)2最小。具体解法是贪心。

这题我无语了,就因为打错一个字母,WA了4次。还好在队友帮助下及时发现,否则还不知道要纠结多久……

下面的代码提交时需改数据类型,防止溢出。

View Code
 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 }

 

posted @ 2012-04-18 09:53  BeatLJ  阅读(214)  评论(0编辑  收藏  举报