为什么我的 USACO 银种计数代码不起作用?
Why does my code to USACO Silver Breed Counting not work?
这是我的代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("bcount.in", "r", stdin);
freopen("bcount.out", "w", stdout);
int n, q;
cin >> n >> q;
vector<int> holsteins(n);
vector<int> guernseys(n);
vector<int> jerseys(n);
for (int i = 0 ; i < n ; i++) {
holsteins[i+1]=holsteins[i];
guernseys[i+1]=guernseys[i];
jerseys[i+1]=jerseys[i];
int a;
cin >> a;
if (a==1) holsteins[i+1]++;
else if (a==2) guernseys[i+1]++;
else jerseys[i+1]++;
}
for (int i = 0; i < q ; i++) {
int a, b;
cin >> a >> b;
cout << holsteins[b]-holsteins[a-1] << " " << guernseys[b]-guernseys[a-1] << " " << jerseys[b]-jerseys[a-1] << "\n";
}
return 0;
}
当我运行它时,它没有通过样例,官方评分员说有运行时间错误或记忆失败。我怀疑它有一些带输入输出的东西,但没有。这里有什么问题?
显示的代码中存在多个错误,假设它甚至可以编译,因为:
#include <bits/stdc++.h>
这是一个 non-standard 头文件。在某些 C++ 编译器上,显示的代码甚至无法编译。假设显示的代码编译:
cin >> n >> q;
vector<int> holsteins(n);
未检查此输入的有效性。无效或负输入会导致未定义的行为。
for (int i = 0 ; i < n ; i++) {
holsteins[i+1]=holsteins[i];
当 i
为 n-1
时,这会导致未定义的行为,因此 i+1
为 n
,并分配给 holsteins[n]
,它不存在.
guernseys[i+1]=guernseys[i];
jerseys[i+1]=jerseys[i];
同样的错误,访问向量中不存在的值时的未定义行为。
int a;
cin >> a;
if (a==1) holsteins[i+1]++;
Continuation/variation 第一个bug。无效或负输入会导致未定义的行为。
int a, b;
cin >> a >> b;
cout << holsteins[b]-holsteins[a-1] << " " << guernseys[b]-
以上所有错误,合并。由于无效或负输入,或由于访问不存在的矢量值(当 b
或 a
为 n
或更大时)导致的未定义行为。
这就是我能理解为什么显示的代码由于未定义的行为而无法正常工作的所有原因。
这是我的代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("bcount.in", "r", stdin);
freopen("bcount.out", "w", stdout);
int n, q;
cin >> n >> q;
vector<int> holsteins(n);
vector<int> guernseys(n);
vector<int> jerseys(n);
for (int i = 0 ; i < n ; i++) {
holsteins[i+1]=holsteins[i];
guernseys[i+1]=guernseys[i];
jerseys[i+1]=jerseys[i];
int a;
cin >> a;
if (a==1) holsteins[i+1]++;
else if (a==2) guernseys[i+1]++;
else jerseys[i+1]++;
}
for (int i = 0; i < q ; i++) {
int a, b;
cin >> a >> b;
cout << holsteins[b]-holsteins[a-1] << " " << guernseys[b]-guernseys[a-1] << " " << jerseys[b]-jerseys[a-1] << "\n";
}
return 0;
}
当我运行它时,它没有通过样例,官方评分员说有运行时间错误或记忆失败。我怀疑它有一些带输入输出的东西,但没有。这里有什么问题?
显示的代码中存在多个错误,假设它甚至可以编译,因为:
#include <bits/stdc++.h>
这是一个 non-standard 头文件。在某些 C++ 编译器上,显示的代码甚至无法编译。假设显示的代码编译:
cin >> n >> q;
vector<int> holsteins(n);
未检查此输入的有效性。无效或负输入会导致未定义的行为。
for (int i = 0 ; i < n ; i++) {
holsteins[i+1]=holsteins[i];
当 i
为 n-1
时,这会导致未定义的行为,因此 i+1
为 n
,并分配给 holsteins[n]
,它不存在.
guernseys[i+1]=guernseys[i];
jerseys[i+1]=jerseys[i];
同样的错误,访问向量中不存在的值时的未定义行为。
int a;
cin >> a;
if (a==1) holsteins[i+1]++;
Continuation/variation 第一个bug。无效或负输入会导致未定义的行为。
int a, b;
cin >> a >> b;
cout << holsteins[b]-holsteins[a-1] << " " << guernseys[b]-
以上所有错误,合并。由于无效或负输入,或由于访问不存在的矢量值(当 b
或 a
为 n
或更大时)导致的未定义行为。
这就是我能理解为什么显示的代码由于未定义的行为而无法正常工作的所有原因。