USACO Arithmetic Progressions(暴力)

本文探讨了一种高效查找等差数列的方法,适用于特定集合中元素为P^2+q^2形式的情况。通过直接暴力搜索与避免使用map结构,实现了在给定时间内快速找到所有符合条件的等差数列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目请点我
题解:
这道题的题意是找出集合里所有固定长度为N的等差数列,集合内的元素均为P^2+q^2的形式(0<=p,q<=M)。时间要求5s内,本着KISS,直接暴力。但是后来竟超时了,检查后发现是map的问题,本想利用map实现常数级的查找,但是显然map内部不是这样的,所以对于普通的数据类型,数据量不大(250^2+250^2)的情况下还是利用数组标记查找好一点,get。
代码实现:

/*
ID: eashion
LANG: C++
TASK: ariprog
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <map>
#include <algorithm>
#define MAX 125000

using namespace std;

int N,M;
bool flag;
int num[MAX];
int mm[MAX];
bool test(int start,int len);
int main()
{
    freopen("ariprog.in","r",stdin);
    freopen("ariprog.out","w",stdout);
    while( scanf("%d%d",&N,&M) != EOF ){
        int pos = 0;
        flag = false;
        memset(mm,0,sizeof(mm));
        for( int i = 0; i <= M; i++ ){
            for( int j = 0; j <= M; j++ ){
                int tmp = i*i+j*j;
                if( mm[tmp] != 1 ){
                    num[pos] = tmp;
                    mm[tmp] = 1;
                    pos++;
                }
            }
        }
        sort(num,num+pos);
        int up_B = (num[pos-1]-num[0])/(N-1);
        for( int i = 1; i <= up_B; i++ ){
            for( int j = 0; j < pos; j++ ){
                if( test(num[j],i) ){
                    flag = true;
                    printf("%d %d\n",num[j],i);
                }
                if( num[j]+(N-1)*i > num[pos-1] ){
                    break;
                }
            }
        }
        if( flag == false ){
            printf("NONE\n");
        }
    }
    return 0;
}

bool test(int start,int len){
    int tmp = start;
    for( int i = 0; i < N; i++ ){
        if( mm[tmp] != 1 ){
            return false;
        }
        tmp += len;
    }
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值