如何解决告诉我该代码将在其中提供错误输出的输入
有一个问题,我必须在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
,请将0
和1
放在neighbours
中。 -
如果未找到邻居(
neighbours.empty() == true
),则返回A.size()
。 -
定义一个
minimum
变量,并使用A.size() - 1
对其进行初始化,这是您现在所知道的最糟糕的结果。因此,size_t minimum = A.size() - 1;
-
遍历存储在
neighbours
(for(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 举报,一经查实,本站将立刻删除。