【发布时间】:2020-11-25 09:38:55
【问题描述】:
给定一个大小为N的非负整数的未排序数组A,找到一个连续子数组,它与给定数S相加。
输入:
输入的第一行包含一个整数 T,表示测试用例的数量。然后是 T 测试用例。每个测试用例由两行组成。每个测试用例的第一行是 N 和 S,其中 N 是数组的大小,S 是总和。每个测试用例的第二行包含 N 个空格分隔的整数,表示数组元素。
输出:
对于每个测试用例,在新行中,如果 sum 等于子数组,则从左侧打印第一个出现的子数组的开始和结束位置(1 个索引),否则打印 -1。
约束:
1 <= T <= 100
1 <= N <= 107
1 <= Ai <= 1010
示例:
输入:
2
5 12
1 2 3 7 5
10 15
1 2 3 4 5 6 7 8 9 10
输出:
2 4
1 5
我的代码:
#include <iostream>
using namespace std;
int main() {
int t, n, s, a[1000], result[1000];
cin >> t;
for (int i = 0; i < t; i++) {
result[i * 2] = -1;
cin >> n >> s;
for (int j = 0; j < n; j++) {
cin >> a[j];
}
int flag = 0;
for (int j = 0; j < n; j++) {
if (flag == 0) {
int sum = 0;
for (int k = j; k < n && sum < s; k++) {
sum += a[k];
if (sum == s) {
result[i * 2] = j + 1;
result[(i * 2) + 1] = k + 1;
flag = 1;
break;
}
}
}
}
}
for (int i = 0; i < t * 2; i += 2) {
if (result[i] != -1) {
cout << result[i] << " " << result[i + 1] << endl;
} else {
cout << result[i];
}
}
}
结果:
错误的答案。 !!!错误的答案
您的代码可能无法在多个测试用例 (TC) 中正常工作。
您的代码失败的第一个测试用例:
输入:
4 225
9 45 10 190
它的正确输出是:
-1
你的代码的输出是:
-1-1-1-138 42
【问题讨论】:
-
如果你的输入导致输出错误,很容易做这些比赛网站没有教你的事情:调试!不同的调试技术和能够使用调试器对任何程序员都至关重要,即使对于业余爱好者也是如此。
-
关于比赛场地和教学……它们应该不被视为教学或学习资源!他们真正教的只是坏习惯。坏习惯(以及好习惯)往往会坚持下去。所以在使用竞赛网站作为培训资源之前,请阅读some good books,上几节课,并正确并养成良好的习惯学习C++。
-
第一步:将这段代码分割成更小的函数,分离:main、读取数据、计算结果和打印。第二步:考虑是否可以通过只遍历表两次来找到答案。
标签: c++