蓝桥杯 K偶数 知识点:哈希

40 阅读1分钟

9.K偶数 - 蓝桥云课 (lanqiao.cn)

思想

先往一个set里面放入n个数,然后再从2开始往后枚举偶数,看枚举的偶数是否在set里出现过,没出现过就往set里放,一共放k次,放完之后对set求个和输出即可。

code

这是我刚开始写的,只能过1个样例:

#include<bits/stdc++.h>
using namespace std;
#define MOD 1000000007
set<int>a;
int main()
{
	int n, k; cin >> n >> k;

	for (int i = 0; i < n; i++)
	{
		int x; cin >> x;
		a.insert(x);
	}
int cnt = 0;int i = 2;
	while (1)
	{
		
		
		if (!a.count(i))
		{
			a.insert(i);
			cnt++;

			if (cnt >= k)break;
		}
		i += 2;
	}

	int sum = 0;
	for (auto it = a.begin(); it != a.end(); it++)
	{
		sum += *it;
	}

	cout << sum%MOD;
	return 0;
}

image.png

这里多处取模就全部过了:

#include<bits/stdc++.h>
using namespace std;
#define MOD 1000000007
set<int>a;
int sum;
int main()
{
	int n, k; cin >> n >> k;

	for (int i = 0; i < n; i++)
	{
		int x; cin >> x;
    sum+=x;
    sum%=MOD;
		a.insert(x);
	}
int cnt = 0;int i = 2;
	while (1)
	{
		if (!a.count(i))
		{
			a.insert(i);
      sum+=i;
      sum%=MOD;
			cnt++;

			if (cnt >= k)break;
		}
		i += 2;
	}


	cout << sum%MOD;
	return 0;
}

image.png

当然只在结尾处取模也能过,但为了保险起见,还是多除取模比较好,可以防止过程中溢出:

#include <bits/stdc++.h>
using namespace std;
#define MOD  1000000007
#define int long long
set<int>s;
int sum;

signed main() {
	int n, k;
	cin >> n >> k;


	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		s.insert(x);
		sum = sum + x ;
	}

	int cnt = 0, i = 2;
	while (1) {
		if (!s.count(i)) {
			sum = sum + i ;
			s.insert(i);
			cnt++;

			if (cnt == k)
				break;
		}
		i += 2;
	}

	cout << sum % MOD << endl;


	return 0;
}

image.png

最后要说一点就是每个元素最大都是1e9,代码中有相加情况,要开long long,不然只能过70%。