USACO-Section1.4 Arithmetic Progressions[...]

2017-06-10
发现自己目前的最大问题就是浮躁。。根本无法静下心来思考……所谓欲速则不达。这个程序很好的提醒了我这个问题,,请不要慌张,无论面临什么处境。^_^

题目大意:

给出两个整数N (3 <= N <= 25),M(1 <= M <= 250)。定义p,q(0 <= p,q <= M),求由p^2+q^2构成的数列中长度不小于N的等差数列。输出的每行为一个符合条件的等差数列的首项和公差,输出顺序先按公差递增再按首项递增。

样例输入:

5
7

样例输出:

1 4
37 4
2 8
29 8
1 12
5 12
13 12
17 12
5 20
2 24

题解:

首先要求出p^2+q^2构成的序列,再在其中找等差数列。我用一个bool数组来记录可选值(p^2+q^2的可能值),这个数组的大小曾是bug之一。。至于公差的值应该在1~X,其中X为M^2/(N-1),这是0~M^2范围的整数可能构成长度不小于N的等差数列时,公差的最大取值。
此外,寻找等差数列时内循环的判断条件很重要,没有写全条件会运行超时。

代码如下:

/*
ID: madara01
PROG: ariprog
LANG: C++
*/

#include <iostream>
#include <fstream>
#define MAX 250

using namespace std;

int squares[MAX + 1];   //存储0~250的平方
bool bisquares[MAX*MAX*2 + 1];  //特别注意这个数组的大小。。
int n,m;
bool flag = false;  //指示是否有解

int main()
{
    ofstream fout ("ariprog.out");
    ifstream fin ("ariprog.in");
    fin >> n >> m;
    int i,j,k,x,count;
    squares[0] = 0;
    for(i = 1; i <= m; i++){
        squares[i] = i*i;
    }
    int len = squares[m]*2 + 1;
    for(i = 0; i <= m; i++){
        for(j = i; j <= m; j++){
            k = squares[i] + squares[j];  //初始化可选值数组
            bisquares[k] = true;
        }
    }
    k = len/(n-1) + 1;  //公差最大值为(可选值最大值/(n-1))
    for(i = 1; i < k; i++){  //公差的取值1~k
        for(j = 0; j < len ; j++){  //把每个可选值作为首项
            if(!bisquares[j]) continue;
            x = j; count = 1;
            while(bisquares[x] == true && (x+i) < len && bisquares[x+i] == true && count <= n){
                count++; x = x+i;
            }
            if(count >= n){
                fout << j << " " << i << endl; flag = true;
            }
        }
    }
    if(flag == false) fout << "NONE" << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值