CodeForces - 254C(思维)

原题链接

  1. 题目大意
    给定两个字符串,将第一个字符串变为和第二个字符串含有元素相同的字符串,字符可以变成任意字符,保证改变的次数最少,在改变次数最少的前提下输出字典序最小的字符串。

  2. 思路
    在确定一个题怎么做的时候要知道自己求什么。
    首先求改变字符的次数,其次输出一个字符串。首先先统计每个字符串中字符的个数。什么时候字符会改变,当第一个字符串中一个字符的个数大于第二个字符时,该字符有可能改变,变成的字符应该是第二个字符串中比第一个字符串多的字符,一定会改变是指改变当前字符可以使字符串字典序变小。按照这个思路从前往后枚举第一个字符串的元素最后得到的改变次数最少并且就是字典序最小的。

  3. 代码

#include<bits/stdc++.h>
using namespace std;
int a[30],b[30];
string s1,s2;
int main()
{
    ios::sync_with_stdio(false);
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin>>s1>>s2;
    for(int i=0; i<s1.size(); i++)
    {
        a[s1[i]-'A']++;
        b[s2[i]-'A']++;
    }
    int x;
    int ans=0;
    for(int i=0; i<s1.size(); i++)
    {
        x=s1[i]-'A';
        if(a[x]>b[x])
        {
            for(int j=0; j<26; j++)
                if(a[j]<b[j])
                {
                    if(j<x||!b[x])
                    {
                        s1[i]=j+'A';
                        b[j]--;
                        ans++;
                    }
                    else
                        b[x]--;
                    break;
                }
            a[x]--;
        }
    }
    cout<<ans<<endl;
    cout<<s1<<endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值