如何解决 codechef ide 上的 sigabrt 错误
How do I resolve sigabrt error on codechef ide
Sigabrt 运行时发生致命错误,因为 assert 语句未返回 true?或者使用过多的内存,我无法弄清楚我在这里做错了什么,帮帮我?
(codeforces 上的问题 1343 C)link
所以这是代码。
#include <iostream>
#include <stdlib.h>
#include<vector>
using namespace std;
int check(int i,vector<int> a) {
if (a[i] > 0) {
return 1;
}
else return 0;
}
int main() {
int t;
cin >> t;
while (t--)
{
long int n;
cin >> n;
vector<int> a(n), b;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int i = 0;
while (i < n)
{
int max = a[i];
int s = check(i,a);
i++;
while (i<n && check(i,a)== s) {
if (a[i] > max)max = a[i];
i++;
}
b.push_back(max);
}
int s = 0;
for (int k = 0; k< b.size(); k++) {
s += b[i];
}
cout << s << endl;
}
}
我已经调试了你的代码,并且修改后的代码已被接受用于上述问题。
你犯的错误:
1. 在下面的循环中,vector<int> b
的 i'th index
处的值被添加到 long int s
。相反,b[k]
应该添加到 long int s
,因为循环中使用的 变量是 k
而不是 i
.
for (int k = 0; k< b.size(); k++) {
s += b[i];
}
2. 在问题中,variable n
的范围给出为 (1 ≤ n ≤ 2.10^5) .因此,使用 int n
而不是 long int n
是安全的。此外,当我在 codeforces 上提交我的代码时,当我使用 long int n
.
时,它给了我 有符号整数溢出错误
3. 你需要使用long long s
而不是long int s
因为数组A的每个元素的值都在( −10^9 ≤ a[i] ≤ 10^9 , ai ≠ 0) 当我们添加元素时它可以 轻松超越 int
和 long int
范围.
4. 虽然,当我在函数
中使用 vector<int> a
时答案被接受了
int check(int i,vector<int> a) {
if (a[i] > 0) {
return 1;
}
else return 0;
}
但是正如用户 Scheff 所说并且是正确的,它会在 space 和时间上受到惩罚,您应该使用引用调用,即 vector<int> &a
.
修改后的代码:
#include <iostream>
#include <stdlib.h>
#include<vector>
using namespace std;
int check(int i, vector<int> &a) {
if (a[i] > 0) {
return 1;
}
else return 0;
}
int main() {
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vector<int> a(n), b;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int i = 0;
while (i < n)
{
int max = a[i];
int s = check(i,a);
i++;
while ((i<n) && (check(i,a)== s)) {
if (a[i] > max)
max = a[i];
i++;
}
b.push_back(max);
}
long long s = 0;
for (int k = 0; k< b.size(); k++) {
s += b[k];
}
cout << s << endl;
}
}
已接受答案的屏幕截图:
Sigabrt 运行时发生致命错误,因为 assert 语句未返回 true?或者使用过多的内存,我无法弄清楚我在这里做错了什么,帮帮我?
(codeforces 上的问题 1343 C)link 所以这是代码。
#include <iostream>
#include <stdlib.h>
#include<vector>
using namespace std;
int check(int i,vector<int> a) {
if (a[i] > 0) {
return 1;
}
else return 0;
}
int main() {
int t;
cin >> t;
while (t--)
{
long int n;
cin >> n;
vector<int> a(n), b;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int i = 0;
while (i < n)
{
int max = a[i];
int s = check(i,a);
i++;
while (i<n && check(i,a)== s) {
if (a[i] > max)max = a[i];
i++;
}
b.push_back(max);
}
int s = 0;
for (int k = 0; k< b.size(); k++) {
s += b[i];
}
cout << s << endl;
}
}
我已经调试了你的代码,并且修改后的代码已被接受用于上述问题。
你犯的错误:
1. 在下面的循环中,vector<int> b
的 i'th index
处的值被添加到 long int s
。相反,b[k]
应该添加到 long int s
,因为循环中使用的 变量是 k
而不是 i
.
for (int k = 0; k< b.size(); k++) {
s += b[i];
}
2. 在问题中,variable n
的范围给出为 (1 ≤ n ≤ 2.10^5) .因此,使用 int n
而不是 long int n
是安全的。此外,当我在 codeforces 上提交我的代码时,当我使用 long int n
.
3. 你需要使用long long s
而不是long int s
因为数组A的每个元素的值都在( −10^9 ≤ a[i] ≤ 10^9 , ai ≠ 0) 当我们添加元素时它可以 轻松超越 int
和 long int
范围.
4. 虽然,当我在函数
中使用vector<int> a
时答案被接受了
int check(int i,vector<int> a) {
if (a[i] > 0) {
return 1;
}
else return 0;
}
但是正如用户 Scheff 所说并且是正确的,它会在 space 和时间上受到惩罚,您应该使用引用调用,即 vector<int> &a
.
修改后的代码:
#include <iostream>
#include <stdlib.h>
#include<vector>
using namespace std;
int check(int i, vector<int> &a) {
if (a[i] > 0) {
return 1;
}
else return 0;
}
int main() {
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vector<int> a(n), b;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int i = 0;
while (i < n)
{
int max = a[i];
int s = check(i,a);
i++;
while ((i<n) && (check(i,a)== s)) {
if (a[i] > max)
max = a[i];
i++;
}
b.push_back(max);
}
long long s = 0;
for (int k = 0; k< b.size(); k++) {
s += b[k];
}
cout << s << endl;
}
}
已接受答案的屏幕截图: