您的位置:首页 > 大数据 > 人工智能

USACO TRAINING 1.4.4 Arithmetic Progressions(暴力+非递归)

2013-11-20 21:07 281 查看
题意:给你n,m ,问你在 m内两个平方数的和组成长度为n的等差数列的数列数有多少个

解题思路:暴力,递归太费时,所以要改成非递归的形式

解题代码:

// Arithmetic Progressions.cpp : 定义控制台应用程序的入口点。
//

//#include "stdafx.h"

/*
ID: dream.y1
PROG: ariprog
LANG: C++
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

int a[260];
int b[100000];
int hs[500000];
void dfs(int i, int j)
{
return;
}
int num = 0 ;
struct node{
int x,  y ;
}ans[10003];
int cmp(const void *a ,const void *b)
{
if((*(node *)a).y == (*(node *)b).y)
return (*(node *)a).x - (*(node *)b).x;
else return (*(node *)a).y - (*(node *)b).y;
}
int main()
{
memset(hs,0,sizeof(hs));
int n ,m ;
FILE *p = fopen("ariprog.in","r");
FILE *p1 = fopen("ariprog.out","w");
fscanf(p,"%d %d",&n,&m);
for(int i = 1; i <= m;i ++)
{
a[i] = i * i ;
hs[a[i]] = 1;
}
// printf("%d\n",a[250]);
int k = 0 ;

for(int i = 1;i <= m ;i ++)
for(int j = i;j <= m ;j ++)
{
hs[a[i]+a[j]] = 1;
}

k = 0;
hs[0] = 1;
for(int i = 0 ;i <= 140000;i ++)
{
if(hs[i])
{
b[++k] = i;
}
}
//printf("**%d\n",k);
for(int i = 1; i<= k;i ++)
{
for(int j =i+1; j <= k; j ++ )
{
int ti = b[j] ;
int temp = b[j] - b[i];
int step = 0 ;
while(hs[ti])
{
step ++;
ti = ti + temp;
}
//    printf("%d %d %d\n",b[i],temp,step);
if(step >= n -1)
{
//printf("%d %d %d\n",b[i],temp,step);
num ++;
ans[num].x = b[i];
ans[num].y = temp;
}
}
//printf("%d\n",b[i]);
}

qsort(ans+1,num,sizeof(node),cmp);
for(int i = 1;i <= num; i++)
fprintf(p1,"%d %d\n",ans[i].x,ans[i].y);
if(num == 0 )
fprintf(p1,"NONE\n");
fclose(p);
fclose(p1);
return 0 ;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: