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。然後思維就侷限了,考完再想了一下,似乎逆向貪心可以?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章