【CCF】202006-2-稀疏向量(c++)
既要考虑时间复杂度又要考虑空间复杂度,虽然能轻松拿到30、60分,但想要拿100还的确要下点功夫。
注意的点:
1、测试点7,8,9,10数据规模太大,不可使用下标去表示向量位置。就算把数组开到堆区还是不够去表示的。这也有失稀疏矩阵的原意。 ——空间不够。
2、不可使用两层for循环去遍历。——时间不够。
代码长度 624B
编程语言 C++
评测结果 正确
得分 100
时间使用 1.468s
空间使用 18.73MB
下面的这段代码,是看了许多博主后得出来的。
初看他的while循环与我的for循环没啥不一样,但是细琢磨的话:
- p、q跟像两个指针,同时在向后扫描,其时间复杂度可以说是O(n)
- 而我的两次for循环,时间复杂度那是实打实的O(n^2)。
(附:虽然在后期我对我的for循环进行了一些改进。)
#include<iostream>
using namespace std;
struct point {
int m_x;
int m_y;
};
struct point a[999999],b[999999];
int main()
{
int a_n, b_n, n;
cin >> n >> a_n >> b_n;
for (int i = 0; i < a_n; i++) {
cin >> a[i].m_x;
cin >> a[i].m_y;
}
for (int i = 0; i < b_n; i++) {
cin >> b[i].m_x;
cin >> b[i].m_y;
}
long long res = 0;
int p = 0, q = 0;
while (p < a_n && q < b_n) {
if (a[p].m_x == b[q].m_x) {
res = a[p].m_y * b[q].m_y + res;
//cout << "res: " << res << endl;
p++;
q++;
}
if (a[p].m_x > b[q].m_x) {
q++;
}
if (a[p].m_x < b[q].m_x) {
p++;
}
}
cout << res;
return 0;
}
附:
for (int i = 0; i < b_n; i++) {
//temp_a = 0, temp_b = 0;
cin >> temp_a >> temp_b;
for ( j = k; j < a_n; j++) {
if (temp_a == a[j].first) {
long long temp = temp_b * a[j].second;
res = temp + res;
k = j;
break;
}
}
}