• 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 }
  • 相关阅读:
    转载:configure生成的文件(1.5.3)《深入理解Nginx》(陶辉)
    现场管理
    02 表扫描
    01 成本的含义
    16 计划稳定性与控制
    14 事务处理
    13 SELECT 以外的内容
    12 索引
    11 半联结 & 反联结
    08 分析函数
  • 原文地址:https://www.cnblogs.com/algorithms/p/2454635.html
Copyright © 2020-2023  润新知