3月29日 网易雷火笔试(人生第一次笔试)记录

第一题(签到题)AC

在这里插入图片描述

第一题刚开始觉得挺简单,就按常规方法:先dp求出F(N)的字符串,然后用map做容器计每个字母出现的次数。但是敲完了往上一贴,爆内存了。(出题人真鸡贼啊)然后开始优化

优化思路

用3个map,
map1记录s1中出现过的字符的次数,s1中没出现,s2中出现的,这里记0。
map2记录s2中出现过的字符的次数,s2中没出现,s1中出现的,这里记0。
map3先将s1+s2中所有出现过字符的次数为0,然后逐个匹配使得map3=map1+map2。
之后就是dp,3个map不断迭代即可。

这样一来空间就小很多了,只需要3个map。

然后代码往上一贴,ac了。

贴个ac代码:

#include<bits/stdc++.h>

using namespace std;

int main(void)
{
	int z;
	cin >> z;
	string s1, s2, s3;
	cin >> s1 >> s2;
	s3 = s1 + s2;
	map<char, int> mci1, mci2, mci3;
	map<char, int>::iterator it;
	for (int i = 0; i < s1.size(); i++)mci1[s1[i]]++;
	for (int i = 0; i < s2.size(); i++)mci2[s2[i]]++;
	if (z == 1)for (it = mci1.begin(); it != mci1.end(); it++)cout << it->first << ":" << it->second << endl;
	else if (z == 2)for (it = mci2.begin(); it != mci2.end(); it++)cout << it->first << ":" << it->second << endl;
	else
	{
		for (int i = 0; i < s2.size(); i++)if (mci1.find(s2[i]) == mci1.end())mci1[s2[i]] = 0;
		for (int i = 0; i < s1.size(); i++)if (mci2.find(s1[i]) == mci2.end())mci2[s1[i]] = 0;
		for (int i = 0; i < s3.size(); i++)mci3[s3[i]] = 0;
		for (int i = 3; i <= z; i++)
		{
			for (it = mci3.begin(); it != mci3.end(); it++)mci3[it->first] = mci1[it->first] + mci2[it->first];
			for (it = mci1.begin(); it != mci1.end(); it++)mci1[it->first] = mci2[it->first];
			for (it = mci2.begin(); it != mci2.end(); it++)mci2[it->first] = mci3[it->first];
		}
		for (it = mci3.begin(); it != mci3.end(); it++)cout << it->first << ":" << it->second << endl;
	}
}

第二题 case18.33

在这里插入图片描述
这题我开始用的正向贪心,写完跑了一下case18.33。然后思维就局限了,考完再想了一下,似乎逆向贪心可以?

发布了181 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43461641/article/details/105187415