【发布时间】:2019-07-24 11:43:52
【问题描述】:
当我在 pbinfo.ro 上处理 structs 的问题时,我发现了一个问题,其中我得到了两个矩阵的维度,每个矩阵的 nonzero 元素的数量(N1,分别为 N2)然后 N1 + N2 组 3 个数字如下:
- 坐标,X 和 Y
- 位于这些坐标处的值
我要做的是编写一个程序,对这两个矩阵求和(它们都具有相同的维度)并输出输入中给出的和(X、Y 和坐标处的值)。
问题全文如下:
Matrice-Rara | www.pbinfo.ro
要求
给出了两个稀有矩阵,你 被要求计算它们的总和。
如果矩阵
A (n, m)的大部分元素等于 零(至少一半)。由于非零数的数量很少,一个 稀有矩阵A (n, m)和k非零元素可以使用 数组X包含k三元组形式(行、列、值)对应于 矩阵的非零值。数组X的元素存储在line和column的字典顺序。例如带有
n = m = 3的矩阵:1 0 2 0 0 5 0 2 0将以这种方式保存在
X:{(1,1,1), (1,3,2), (2,3,5), (3,2,2)}。输入数据
输入文件
matrice_rara.in在第一行包含 两个矩阵的维度n m,代表行数 和列,以及N1 N2,矩阵A的非零元素的数量和 矩阵B。然后下面的N1行将包含三元组 矩阵A按字典顺序排列,最后一行N2将包含 表示矩阵B的非零元素的三元组,也在 字典顺序。输出数据
输出文件
matrice_rara.out将在第一行包含 矩阵C中非零元素的数量,然后是矩阵 本身以按字典顺序排列的三元组形式,每行一个。限制和说明
1 ≤ n, m ≤ 1,000,0001 ≤ N1, N2 ≤ 300,000-1,000,000,000 ≤ A[i][j], B[i][j] ≤ 1,000,000,000Time Limit: 1 secondMemory Limit: 64 MB / 8 MB
我尝试的是读取一个三元组数组中的所有三元组,对数组进行排序,然后将具有相同坐标的元素的值添加到数组中具有重复坐标的第一个元素中。
这是我的代码:
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("matrice_rara.in");
ofstream cout("matrice_rara.out");
struct matrix
{
int coord1, coord2;
long long val;
} data[600001];
bool operator<(matrix const &a, matrix const &b)
{
if (a.coord1 == b.coord1) {
if (a.coord2 == b.coord2) {
return a.val < b.val;
}
return a.coord2 < b.coord2;
}
return a.coord1 < b.coord1;
}
int main()
{
int lin, col, unNul1, unNul2;
cin >> lin >> col >> unNul1 >> unNul2;
for (int i = 1; i <= unNul1 + unNul2; i++)
cin >> data[i].coord1 >> data[i].coord2 >> data[i].val;
sort(data + 1, data + unNul1 + unNul2 + 1);
int unNull = 0;
for (int i = 1; i <= unNul1 + unNul2; i++)
{
int start = i;
while (data[i + 1].coord1 == data[i].coord1 && data[i + 1].coord2 == data[i].coord2 && i + 1 <= unNul1 + unNul2)
i++, data[start].val += data[i].val;
if (data[start].val)
unNull++;
}
cout << unNull << "\n";
for (int i = 1; i <= unNul1 + unNul2; i++)
{
if (data[i].val)
cout << data[i].coord1 << " " << data[i].coord2 << " " << data[i].val << "\n";
while (data[i + 1].coord1 == data[i].coord1 && data[i + 1].coord2 == data[i].coord2 && i + 1 <= unNul1 + unNul2)
i++;
}
}
上面的代码得到 65 分(满分 100 分),9 次测试中有 6 次得到正确答案,其余的都得到错误答案(没有 TLE)。
有什么帮助吗?
【问题讨论】:
-
请不要将在线评委或竞赛网站作为基本的学习资源,它们不会真正教给你任何有用的东西,除了擅长这些网站之外,没有太多其他的东西。相反,我建议您 get a few good books 阅读。如果您切换到更好的学习资源,您将不会(希望)养成使用基于 1 的数组索引(除其他外)这样的坏习惯。
-
作为您的问题可能的一个可能提示:您有一个错误,您将超出范围
data数组中的初始化数据。如果你正确地学习了 C++,那么你可能不会出现这个错误。 -
@Someprogrammerdude 我确实读过一些书,但它们只是让我开始编程。此外,那些教我这种基于一的索引编程的人。从那时起(5 年前),我就一直以这种方式编程。我尽我所能摆脱这种习惯,然而,这并不容易,因为现在感觉像是本能的东西。在线评委不是我的学习资源,别担心。我只使用它们来锻炼我编写正确、干净代码的能力。另外,600001 足以确保元素适合,否则在线法官会给我
Caught Fatal Signal 11。 -
在这种情况下,我很抱歉,但仍然恳请您购买我链接到的(策划)列表中列出的好本书之一。它还应该有望解释为什么放 ` && i + 1 short-circuit evaluation)。
-
顺便说一句,那些是sparse matrices。
标签: c++ arrays sorting matrix struct