微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

告诉我该代码将在其中提供错误输出的输入

如何解决告诉我该代码将在其中提供错误输出的输入

一个问题,我必须在c ++中解决。我已经编写了完整的代码,并且可以在给定的测试用例中工作,但是当我提交它时,它说的是错误的答案。我不明白为什么它显示错误的答案。 我要求您告诉我给定代码的输入,这将给出错误输出,以便我可以进一步修改代码

缩小数组

系统会为您提供长度为A[]的正整数L数组。如果A[i]A[i+1]相等,则将它们替换为一个值为A[i]+1的元素。执行多次此操作后,找出数组的最小可能长度。

注意: 每次执行此类操作后,数组的长度将减少一,并相应地重新枚举元素。

输入格式:

  • 第一行包含一个整数L,表示数组A的初始长度。
  • 第二行包含L个空间整数A[i]-数组A[]的元素。

输出格式:

  • 打印整数-任意次数执行上述操作后可获得的最小长度。

示例:

输入

7
3 3 4 4 4 3 3

输出

2

示例测试用例说明

3 3 4 4 4 3 3 -> 4 4 4 4 3 3 -> 4 4 4 4 4 -> 5 4 4 4 -> 5 5 4 -> 6 4.

因此,数组的长度为2。

我的代码

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

int main()
{
  bool end = false;
  int l;
  cin >> l;

  int arr[l];
  for(int i = 0; i < l; i++){

    cin >> arr[i];
  }
  int len = l,i = 0;

  while(i < len - 1){
    if(arr[i] == arr[i + 1]){
        arr[i] = arr[i] + 1;
        if((i + 1) <= (len - 1)){
            for(int j = i + 1; j < len - 1; j++){
                arr[j] = arr[j + 1];
            }
        }
        len--;
        i = 0;
    }
    else{
        i++;
    }
  }
  cout << len;
  return 0;
}

谢谢

解决方法

如评论中所述:仅选择具有相同值的前两个邻居并将其合并将导致次优结果。

您将需要研究应以某种方式合并的两个邻居。当您将两个邻居合并后,您需要研究在下一级合并哪些邻居。组合的数量可能会很多。

解决此问题的一种方法是通过递归。

如果您已遵循注释中的建议,那么您现在将所有输入数据都存储在std::vector<unsigned> A(L)中。

您现在可以执行std::cout << solve(A) << '\n';,其中solve的签名为size_t solve(const std::vector<unsigned>& A),如下所述:

  • A中查找具有相同值的所有邻居对的索引,并将索引放入std::vector<size_t> neighbours中。示例:如果A包含2 2 2 3,请将01放在neighbours中。

  • 如果未找到邻居(neighbours.empty() == true),则返回A.size()

  • 定义一个minimum变量,并使用A.size() - 1对其进行初始化,这是您现在所知道的最糟糕的结果。因此,size_t minimum = A.size() - 1;

  • 遍历存储在neighboursfor(size_t idx : neighbours))中的所有索引

    • A复制到新的std::vector<unsigned>中。我们称之为cpy
    • cpy[idx]增加1,然后删除cpy[idx+1]
    • 致电size_t result = solve(cpy)。这就是递归的来源。
    • result小于minimum吗?如果是这样,请将result分配给minimum
  • 返回minimum


我认为我不会通过提供一种解决方案来破坏编程工作。它仍然应该有很多事情要处理。大数据等将无法进行递归。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。