我正在尝试从 Yandex 解决这个问题(见下文)
PS我看到了这篇文章,但不幸的是我没有找到我的问题的答案。

我有的问题:
- 我不确定我是否正确理解了任务的本质,我理解它的方式是我应该使用 RNG 来确定数组的大小并用随机值填充它,然后是随机元素的总和应该显示数组,但我是否正确理解了任务的本质?
- 如何控制资源限制?(以我的 Visual Studio 2019 为例)
我未完成的代码
#include <iostream>
#include <random>
#include <ctime>
#include <iomanip>
using namespace std;
class Random /*fold00*/
{
public:
typedef int RandomValue;
Random& operator = (int seed) { X = seed; return *this; }
Random(int seed = 1) :X(seed) {};
int operator()(int seed = 0)
{
const int MM = 2147483647;
const int AA = 48271;
const int QQ = 44488;
const int RR = 3399;
if (seed != 0) X = seed;
X = AA * (X % QQ) - RR * (X / QQ);
if (X < 0) X += MM;
return X - 1;
}
// Не включая max
int operator()(int min, int max)
{
return (*this)() % (max - min) + min;
}
private:
int X;
};
class Random64
{
typedef unsigned long long uint64;
public:
typedef uint64 RandomValue;
Random64& operator = (uint64 seed) { X = seed; return *this; }
Random64(uint64 seed = 0) :X(seed) {};
uint64 operator()(uint64 seed = uint64(-1))
{
const uint64 a = 3202034522624059733ULL;
const uint64 c = 1ULL;
if (seed != uint64(-1)) X = seed;
uint64 Y = a * X + c;
X = a * Y + c;
Y = (Y & 0xFFFFFFFF00000000ULL) | (X >> 32);
return Y;
}
// Не включая max
uint64 operator()(uint64 min, uint64 max)
{
return (*this)() % (max - min) + min;
}
private:
uint64 X;
};
int main()
{
Random64 r(time(0));
typedef long long int llint;
int sum = 0;
llint array_size = r(0, 100000);
llint* mass_ptr = new llint[array_size];
for (llint i = 0; i < array_size; i++)
{
mass_ptr[i] = r(0, 1000000000);
cout << "array [" << i << "] = " << mass_ptr[i] << endl;
if (i == 5)
{
sum = sum + mass_ptr[1] + mass_ptr[r(1, 3)];
}
}
cout << "Summa ravna = " << sum << endl;
system("pause");
return 0;
}
PS我知道现阶段的程序甚至没有实现其本质(据我了解),但这是一种原型 UPD:以及如何缩短该算法?
我回答你的问题。
1问题清楚地表明输入文件
input.txt包含输入数据。您的程序应读取此数据并将答案打印到输出文件。你不需要自己生成任何东西。例如,输入文件可能如下所示:
也就是说,您的程序读取 number
5,然后它必须计算 5 个数字。然后解决问题并将答案输出到文件中output.txt:当然,这个答案只有在我以与问题的编译器相同的方式理解俄语规范的条件下才是正确的。
2资源控制必须由您自己完成。制作元素数组
100'000在内存方面并没有那么昂贵,你可以自己计算。您完全适合分配的 256 MB。就运行时间而言,您应该尝试在您自己进行的大型测试的计算机上运行您的程序。然后你会知道你是否适合。当您将问题提交给他们时,他们将在他们的自动化测试中运行它(为您的程序替换不同的文件input.txt)并检查它是否在分配的时间内运行并在每个输入文件上产生正确的答案。也就是说,您不需要在程序中对时间和内存进行任何特殊检查。应工人的要求:)
我已经在这里回答了,但我很快就被缺点吐了,所以我决定删除我的答案。但是现在我将返回其中的代码,这是我提出的解决方案之一,不是最佳的,但是......
第二个代码是一个名为 Mikhailo 的向量。第三个是他自己的代码,但是使用向量
ints - 将原始数据存储为 是没有意义的long long,因为它们不超过十亿。好吧,最后一个选项是我的,但set替换为unordered_set. 所以,让我们继续讨论结果。我考虑了解决问题的 4 个选项 -
vector<long long>vector<int>set<int>unordered_set<int>在实验中,从 100,000 到 10 亿个随机数创建了一个文件,其中至少有 20,000 个是重复的。
所有 4 个程序均等计算总和。
我完整记录了时间——从操作系统启动程序到完全退出,结果以毫秒为单位给出了 40 次启动。以 kB 为单位的内存 - 根据 VC ++ 的诊断工具的结果
5 和 6 - 3 和 4 在评论中添加了 Alexey Nikolaev:
全部的:
基本上是你所期望的。使用向量的最快方法。和他在一起,内存消耗最少。
可能还有其他解决方案,但本质是一样的——数据已经为你准备好了。你的工作就是计算它们。
只需阅读、删除重复项和总结即可。最主要的是类型
long long,以便一切都适合。而从内存中——据估计——我们只有一个向量,不超过 100,000 个 8 字节的元素——总共大约 800,000 字节,不到 1 兆字节。
我会张贴我的拐杖)在我看来,等级和矢量是最快的解决方案。