第一题(签到题)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。然后思维就局限了,考完再想了一下,似乎逆向贪心可以?