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 }

 

你可能感兴趣的:(number)