USACO算术进度任务超过了期限

时间:2018-08-01 22:07:22

标签: c++ performance math optimization time

在USACO算术级数任务上,我的代码在输入中超时:

12

50

这是问题说明: 算术级数是形式为a,a + b,a + 2b,...,a + nb的序列,其中n = 0、1、2、3,...。对于这个问题,a是一个非负整数,b是一个正整数。

编写一个程序,在双平方集S中找到所有长度为n的算术级数。双平方的集合定义为形式为p2 + q2的所有整数的集合(其中p和q为非负整数)。

输入格式 第1行:N(3 <= N <= 25),要搜索的级数长度 第2行:M(1 <= M <= 250),将搜索范围限制为0 <= p,q <= M的双平方的上限。

如果未找到序列,则单行显示“ NONE”。否则,输出一行或多行,每行包含两个整数:找到的序列中的第一个元素和同一序列中连续元素之间的差。这些行应按最小差异顺序排列,并在这些顺序中以最小的起始编号排序。

我已经尝试过初步测试“开始”,看看它本身是否是一个双向正方形(您可以在我的代码中看到),,但是它没有足够的效果,并且已经阅读过有关同一问题的其他文章,并且没有帮助。 我的代码在下面。有人可以帮助我找到一种方法来使我的代码在< strong> 5秒时间限制?

#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>

using namespace std;

vector<pair<int, int>> finals;

bool comp(pair<int, int> i, pair<int, int> j)
{
    return (i.second < j.second);
}

bool is_prog(vector<int> prog, vector<int> bi_squares)
{
    for (int i = 0; i < prog.size(); i++)
    {
        if (bi_squares[prog[i]] != 1)
        {
            if (prog[i] == 0)
                continue;
            return false;
        }
    }
    return true;
}

int main()
{
    ofstream fout("ariprog.out");
    ifstream fin("ariprog.in");

    vector<int> bi_squares;
    bi_squares.resize(125001);
    int n, m;
    cin >> n;
    cin >> m;
    for (int i = 0; i <= m; i++)
    {
        for (int j = 0; j <= m; j++)
        {
            if (!binary_search(bi_squares.begin(), bi_squares.end(), (i*i) + (j*j)))
                bi_squares[(i*i) + (j*j)] = 1;
        }
    }
    for (int start = 0; start <= m * m; start++)
    {
        if (start == 0 || bi_squares[start] == 1)
        {
            for (int skip = 1; skip <= m * m; skip++)
            {
                vector<int> prog;
                prog.push_back(start);
                int cnt = 1;
                int curr = start;
                while (cnt < n)
                {
                    curr += skip;
                    prog.push_back(curr);
                    cnt++;
                }
                if (is_prog(prog, bi_squares))
                {
                    finals.push_back(make_pair(start, skip));
                }
                prog.clear();
            }
        }
        else
            continue;
    }
    sort(finals.begin(), finals.end(), comp);
    if (finals.empty())
    {
        cout << "NONE" << "\n";
        return 0;
    }
    for (auto x : finals)
        cout << x.first << " " << x.second << "\n";
    return 0;
}

0 个答案:

没有答案