我必须解决一个问题,需要你的帮助,所以提前致谢。正如你所看到的,标题几乎说明了一切。有一个文件“domes.in”(这是一个文本文件),其中包含 10.000.000 对整数 From (1 - 100.000),所以在第一部分中,我必须在不到 1 秒的时间内保存所有这些数字.
首先,我尝试创建一个 20.000.000 个位置的 int 数组,以便我可以将数字一一保存。数组的大小太大,导致程序没有响应。
在阅读代码之前,请先阅读任务,但请只回答我的问题,不要发布任何代码,因为这是一个在线竞赛的问题,我想自己写。
#include <fstream>
using namespace std;
int main()
{
int n, m, a, b; //N(Value) M(Pairs)
int t = 0;
int r = 0;
int j;
ifstream infile("domes.in");
infile >> n >> m; //N = 100.000 M = 10.000.000
int domes[m*2];
for (j=0; j<m; j++) //For 1 to 10.000.000
{
infile >> a >> b; //Save 10.000.000 Integers
domes[t++] = a;
domes[t++] = b;
}
for (j=1; j<=n; j++) //For J = 1 - 100.000
{
int i=0;
for (int k=0; k<t; k++) //If the point J is appeared
if (domes[k] == j) //+1 Link
i++;
if (i == 1) //If Links < 2 (of number J)
r++; //+1 Point is connected with less than 2 points
} //Else move on to ++J
infile.close();
ofstream outfile("domes.out");
outfile << r;
return 0;
}
现在看来它可能有效,但程序再次没有响应(在运行时,in 引发一个错误,表明程序停止运行。代码中存在任何其他构建错误或错误)。
我做错了什么?
文本文件: 100000 10000000
2344 3444
3345 4564
5566 9455//最大 100.000 的随机整数
//............
//编辑:我从代码中删除了结构“DOMES”,因为它是同一件事
任务:我会用自己的话解释它,因为它很复杂。 map 上有 100.000 个点。这些点是相连的(有 10.000.000 个链接)。我必须找到只有一个连接的点(每个点至少有 1 个连接)。
例如:
5 4(N = 5,M = 4)N(最大值)M(对)
1 2
2 3
4 5
3 4
有 2 个点具有单个连接:1 和 5(1 与 2 连接)和(5 与 4 连接)。其余点至少连接两次:
2:1-2、2-3
3:2-3、3-4
4:4-3、4-5
最佳答案
当涉及大数据的 I/O 时,C++ 流比它们的 C 亲戚慢。我相信你可以用 fopen()
加快写作速度和fwrite()
来自<cstdio>
很多。通过这样做,您可以一次性写入整个数组,并且可能不会出现崩溃问题。
关于C++,读取和保存大量数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20801888/