【CCF】202006-2-稀疏向量(c++)

【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;
			}
		}
	}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值