Google Kickstart 2018,测试用例中的回合错误

Posted

技术标签:

【中文标题】Google Kickstart 2018,测试用例中的回合错误【英文标题】:Google Kickstart 2018, Round error in test case 【发布时间】:2019-10-20 04:39:37 【问题描述】:

我正在尝试解决 Google Kickstart 2018 第 A 轮中的 Scrambled Words 问题。

我无法生成输入字符串。这是他们给的方向

第三行包含两个小写英文字母S1和S2,和 五个整数 N、A、B、C 和 D。S1 和 S2 是前两个字符 教授的字符串 S 的长度,N 是 S 的长度,其他四个 整数是您应该用来生成字符的参数 S,如下:

首先我们将 ord(c) 定义为字符 c 的十进制值,然后 char(n) 作为十进制 n 的字符值。例如,ord('a') = 97 和 char(97) = 'a'。其他可以参考 ASCII 表 转化率。

现在,定义 x1 = ord(S1), x2 = ord(S2 )。然后,使用下面的递归 为 i = 3 到 N 生成 xi

xi = ( A * xi-1 + B * xi-2 + C ) 模 D.

我们定义 Si = char(97 + ( xi modulo 26 )),对于所有 i = 3 到 N。

使用这些方向进行测试输入,

1
5
axpaj apxaj dnrbt pjxdn abd
a a 50 1 1 1 30

我生成的字符串是

aapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaa

但是应该生成的字符串是

aapxjdnrbtvldptfzbbdbbzxtndrvjblnzjfpvhdhhpxjdnrbt

这是我的代码

    char S1, S2;
    long N, A, B, C, D;
    cin >> S1 >> S2 >> N >> A >> B >> C >> D;
    A %= D;
    B %= D;
    C %= D;

    vector<char> S;
    S.push_back(S1);
    S.push_back(S2);

    for (int i = 2; i < N; i++) 
      long xi1 = (long)S[i - 1];
      long xi2 = (long)S[i - 2];
      long xi = (A * xi1) % D;
      xi += ((B * xi2) % D);
      xi += C;
      xi %= D;
      xi %= 26;

      char Si = (char)(97 + xi);
      S.push_back(Si);
    

【问题讨论】:

如果您尝试使用std::cin &gt;&gt; some_std_string 阅读axpaj apxaj dnrbt pjxdn abd,那将无法正常工作。它只会读取axpaj 然后停止。您需要使用getline() 我事先单独阅读了这些内容,没有任何错误。我使用循环读取每个单词,因为单词的数量是给我们的。 【参考方案1】:

在您的代码中,您假设 S_i == x_i 这是错误的。递归公式是用 x_i 定义的,而不是 S_i,考虑下面的代码

#include <iostream>

int main()
    long N = 4;
    long A = 1;
    long B = 1;
    long C = 1;
    long D = 30;

    std::string s = "aa";
    int xi1 = 97;
    int xi2 = 97;
    for (int i = 2; i < N; i++) 
      std::cout<<(int)xi1<<" "<<xi2<< " vs si:"<<(int)s[i-1]<<" "<<(int)s[i-2]<<std::endl;
      int xi = (A*xi1 + B*xi2 + C)%D;
      char si = 97 + (xi%26);
      std::cout<<"xi: "<<xi<<" vs "<<(int)si<<std::endl;
      s += si;
      xi2 = xi1;
      xi1 = xi;
      std::cout<<s<<std::endl;
      std::cout<<"------------------------"<<std::endl;
    
    return 0;

带输出:

97 97 vs si:97 97
xi: 15 vs 112
aap
------------------------
15 97 vs si:112 97
xi: 23 vs 120
aapx
------------------------

【讨论】:

以上是关于Google Kickstart 2018,测试用例中的回合错误的主要内容,如果未能解决你的问题,请参考以下文章

Google Kickstart 2020 轮 D- 破纪录者问题

Google Kickstart Round A 2021-Rabbit House

2019 Google Kickstart Round H

Google Kickstart 2020 Round A: Plates Solution

Kickstart Terraform on GCP with Google Cloud Shell

2019 google kickstart round A