数据加载中……

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 



posted on 2009-07-16 21:45 Chen Jiecao 阅读(438) 评论(0)  编辑 收藏 引用 所属分类: USACO


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理