USACO 1.4.3 Arithmetic Progressions

USACO 1.4.3 Arithmetic Progressions

       这个,自己写了一个代码,很丑.观摩了一些以C++为"母语"的OIer的代码,学习了一些新的写法.直接搜索是可以做的,因此我没有更深入地思考过其他的解法.我发现我把学习C++当作自己学习目标的做法很大程度上淡化了我对算法的关注.
      学习算法,看看《算法导论》之类的书很有好处,学习语言,观摩别人的代码是必不可少的,这是我这几天一来的体会.

下面的代码基本上就是按照人家的代码打了一遍.不过很好理解,解释也是多余的.
 1  /*
 2  ID:31440461
 3  PROG:ariprog
 4  LANG:C++
 5  */
 6  #include < iostream >
 7  #include < algorithm >
 8  using   namespace  std;
 9  const   int  MAX = 250 * 250 * 2 + 10 ;
10  bool  flag[MAX] = {};
11  int  leg[MAX],size = 0 ,res_cnt = 0 ;
12  struct  re
13  {
14       int  a,b;
15       bool   operator   <  ( const  re &  x)  const
16      {
17           return  b < x.b  ||  b == x.b  &&  a < x.a;
18      }
19  }res[ 10000 ];
20 
21  int  main()
22  {
23      freopen( " ariprog.in " , " r " ,stdin);
24      freopen( " ariprog.out " , " w " ,stdout);
25       // memset(flag,0,sizeof(flag));
26       int  n,m;
27      cin  >>  n  >>  m;
28       int  max = m * m * 2 ;
29       for  ( int  i = 0 ;i <= m ; ++ i )
30          for  ( int  j = 0 ;j <= m ; ++ j )
31                   flag[i * i + j * j] = 1 ;
32       for  ( int  i = 0 ;i <= max ; ++ i )  if  (flag[i]) leg[size ++ ] = i;
33      
34       for  ( int  i = 0 ;i < size ; ++ i )
35         for  ( int  j = i + 1 ;j < size ; ++ j )
36        {
37           int  d = leg[j] - leg[i];
38           if  (leg[i] + (n - 1 ) * d > max)  break ;
39           for  ( int  k = 2 ;k < n ;k ++  )
40               if  ( ! flag[leg[i] + k * d])  goto  L1;
41          res[res_cnt].a = leg[i];
42          res[res_cnt ++ ].b = d;
43               L1:;
44        }
45       sort(res,res + res_cnt);
46        if  ( ! res_cnt) cout  <<   " NONE "   <<  endl;
47        else
48        for  ( int  i = 0 ;i < res_cnt ;i ++  ) cout  <<  res[i].a  <<   '   '   <<  res[i].b  <<  endl;
49        return   0 ;
50  }
51 
52 



你可能感兴趣的:(USACO 1.4.3 Arithmetic Progressions)