60分求救

P10836 『FLA - I』歌静河

Oldxu114514 @ 2024-08-04 11:04:54

#include<bits/stdc++.h>
using namespace std;
string a,b;
int n,m;
int cnt;
int main(){
    cin>>n>>m>>a>>b;
    for(int i=0;i<n;i++)
    {
        if(a[i]=='#' && m>0)
        {
            cnt++;
            a[i]='a'+((cnt-1)%26);
            m--;
        }
    }
    cout<<a<<endl;
    return 0;
}

by liaocr @ 2024-08-04 11:22:06

@Oldxu114514 emm 这题能拿60也算奇迹了 从头讲一下思路 这题里字符串b的作用就是借助b字符串里的‘#’跳过一些字母 而你这了里没有用到 所以要先用cnt1统计b字符串里面‘#’的个数代码如下

for(int i=0;i<n;i++){
  if(b[i]=='#'){
    ++cnt1;
  }
}

第二步 遍历a字符串,用一个now记录当前应该输出什么 当遇到‘#’时 要做一个判断 我们这道题要求他字典序最小 有两种情况 就是借助b里的‘#’能让他这一位输出‘a'的 还有不能的 我们就是要判断能不能输出‘a’ 条件就是cnt1+now>=26 之后cnt1的个数要看now的数值而减少 注意这里有一个坑 当now本来就是输出‘a’时没有必要再去用b的‘#’ 所以要加另一个条件 代码如下

for(int i=0;i<n;i++){
  if(a[i]=='#'){
    if(now+cnt1>=26&&now!=0) 
    {
      cout << 'a';
      cnt1-=(26-now);
      now = 1;
    }
    else
    {
      cout << l[now];
      now++;
      now%=26;
    }
  }
  else
  {
    cout<<a[i];
  }
}

这样之后就能AC了 附上AC代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
string a,b;
char l[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int main(){
    int cnt1=0,f=0;
    cin>>n>>m>>a>>b;
    int now = 0;
    for(int i=0;i<n;i++){
        if(b[i]=='#'){
            ++cnt1;
        }
    }
    for(int i=0;i<n;i++){
        if(a[i]=='#'){
            if(now+cnt1>=26&&now!=0) 
            {
                cout << 'a';
                cnt1-=(26-now);
                now = 1;
            }
            else
            {
                cout << l[now];
                now++;
                now%=26;
            }
        }
        else
        {
            cout<<a[i];
        }
    }
    return 0;
}

这是我第4次看到有人求助这道了 上面的这段也是之前我帮人写的 我就改了下 如果有啥不对数组名字对不上啥的 忽视就好 最后的AC代码测过了没有问题 可以的话给个关注吧qwq


by Oldxu114514 @ 2024-08-04 11:23:06

@liaocr 谢谢!!!


|