蒟蒻代码80分求调

P10836 『FLA - I』歌静河

___Segment___ @ 2024-08-05 18:15:39

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

by qfy123 @ 2024-08-06 09:54:17

Hack:

输入:

30 60
##############################
##############################

正确输出:

aabcdefghijklmnopqrstuabcdefgh

你的输出:

aabcdefghijklmnopqrstuvwxyzabc

原因是,字符串 b 中剩下的 5 个空并不是没用了


by qfy123 @ 2024-08-06 10:04:05

@chenrongqing 具体而言,对于这个样例来说,在前面两个 a 填完后 b 中还剩下 5 个空,然而当你填到第 23 个字符时,你有两个选择:

  1. 按照顺序填,那就会在第 23 个字符处填入 v
  2. vwxyz 填入字符串 b,再往字符串 a 的第 23 个字符处填入 a

由于 v 的字典序比 a 大,因此第二种选择是更优的。


by ___Segment___ @ 2024-08-06 10:10:12

@qfy123 那么在我的代码里该如何处理?


by qfy123 @ 2024-08-06 10:18:36

@chenrongqing 一种可能的改法,你往 cnt \ge 25 的那个分支里面,第一个 for 循环和第二个 for 循环之间加一个判断,如果 cnt % 25 不为 0,然后接着编写


by qfy123 @ 2024-08-06 10:25:01

在这个判断里面的 for 循环要实现从 a 填到第 26 - cnt % 25 个字母,然后跳出循环。


by ___Segment___ @ 2024-08-06 10:33:05

@qfy123

if(cnt%25!=0) {
    for(int i=0,j=1;i<n&&j<=26-cnt%25;i++) {
        if(a[i]=='#') {
            a[i]=(++k-1)%26+'a';
            j++;
        }
    }
}

似乎有点小问题?


by qfy123 @ 2024-08-06 10:41:51

首先,你那个 k 要重新赋值为 0,不然这层循环白搞了。

if(cnt%25!=0) {
    for(int i=0,j=1;i<n&&j<=26-cnt%25;i++) {
        if(a[i]=='#') {
            a[i]=(++k-1)%26+'a';
            j++;
        }
    }
    k = 0;
}

然后,你在 cnt < 25 的那一部分也把这一部分代码放在那第一个 for 循环之前


by qfy123 @ 2024-08-06 10:44:10

@chenrongqing 这样应该就是满分了。


by ___Segment___ @ 2024-08-06 10:44:57

@qfy123 谢大佬,已关注。


|