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;
}