洛谷P8013 [COCI2013-2014#4] GMO 50分

题目:https://www.luogu.com.cn/problem/P8013
代码:

#include <bits/stdc++.h>
using namespace std;
string n,m;
int moo['Z'+10];
int main(){
    cin>>n>>m>>moo['A']>>moo['C']>>moo['G']>>moo['T'];
    int min1=0,len=n.size();
    int l=0,r=0;
    while(r<len){
        if(n[l]!=m[r]) min1+=moo[m[r]],r++;
        else l++,r++;
    }
    for(int i=0;i<len;i++){
        int mo=0;
        l=i,r=0;
        while(r<len){
            if(n[l]!=m[r]) mo+=moo[m[r]],r++;
            else l++,r++;
        }
        min1=min(min1,mo);
    }
    cout<<min1;
    return 0;
}

样例过了 3个WA

【以下回答由 GPT 生成】

这段给定的C++代码中存在一些问题。以下是对代码的问题进行识别和优化的步骤:

  1. 初始变量moo数组的大小定义为'Z'+10,这将导致数组越界。应该将大小定义为26个字母的大小,即26。
  2. 在输入时,代码使用了>>运算符将输入的字符直接赋值给moo数组中的对应索引,这会导致字符在转换为整数时转换失败,并且会影响后面字符的读取。应该改为使用cin.get()函数逐个字符读取。
  3. 在第一个while循环中,当n[l]不等于m[r]时,应该先将min1加上moo[m[r]],然后再进行r++操作。当前代码里先进行了r++操作,这导致了计算错误。
  4. 第一个while循环结束后,接下来的for循环中,应该将初始的mo值设置为min1,而不是0。因为min1已经记录了第一个while循环的计算结果。
  5. 在第二个while循环中,应该在每一次循环结束后,将mo加到min1中,并将l和r分别加1。

下面是优化后的代码:

#include <bits/stdc++.h>
using namespace std;

int moo[26];
int main(){
    string n,m;
    cin>>n>>m;
    for(char c='A'; c<='Z'; c++){
        cin >> moo[c-'A'];
    }
    int min1=0,len=n.size();
    int l=0,r=0;
    while(r<len){
        if(n[l]!=m[r]){
          min1+=moo[m[r]-'A'];
        }
        r++;
        l++;
    }
    for(int i=0;i<len;i++){
        int mo=min1;
        l=i,r=0;
        while(r<len){
            if(n[l]!=m[r]){
                mo+=moo[m[r]-'A'];
            }
            r++;
            l++;
        }
        min1=min(min1,mo);
    }
    cout<<min1;
    return 0;
}

这样优化后的代码应该可以解决之前出现错误的测试用例。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^