蓝桥杯2024年第十五届国赛真题E题-最小字符串 题型:模拟 难度:简单

214 阅读1分钟

蓝桥杯2024年第十五届决赛真题-最小字符串 - C语言网 (dotcpp.com)

题解1 贪心

我把s2排个序,这样s2前面字典序就是最小的,我再往s1里面合适的位置插,这样整体得到的字符串就是字典序最小的.

需要注意的是s1和s2的长度不一样,也就是说最后可能s2往s1里插完了,s1还有剩余的部分.

或者s2还没插完s1就没了,那么我们就要把剩余的部分继续在末尾输出完.

image.png

#include<bits/stdc++.h>
using namespace std;
int n,m;

void solve()
{
	cin>>n>>m;
	
	string s1;string s2;cin>>s1>>s2;
	sort(s2.begin(),s2.end());
	int i=0,j=0;
	while(i<n && j<m)
	{
		if(s1[i]<=s2[j])cout<<s1[i++];
		else  cout<<s2[j++];
	} 
	
	while(i<n) cout<<s1[i++];
	while(j<m) cout<<s2[j++];
}
int main()
{
	
	solve();
	return 0;
}

image.png

题解2 哈希

image.png

#include <bits/stdc++.h>

using namespace  std;
int N,M;
string S;
char ch;
map<char ,int> mp;
 
 
void solve()
{
	cin>>N>>M>>S;
    for(int i=0;i<M;++i){
        cin>>ch;
        mp[ch]++;
    }
    auto it=mp.begin();
    for(char i : S){
        while(it != mp.end() && i > it->first){
            cout<<string(it->second,it->first);
            it++;
        }
        cout<<i;
    }
    while (it != mp.end()){
        cout<<string(it->second,it->first);
        it++;
    }
}
signed main(){
     solve();
   
    return  0;
}

image.png