Я новичок в соревновательном программировании. Я пытался решить вопрос о шеф-поваре. когда я попробовал свой компилятор dev C++, я не получил никакой ошибки, однако я получаю ошибку времени выполнения в IDE онлайн-кода Chef.
int main() {
int n,q;
int l,r;
int *A;
int *B;
int *J;
int *C;
cin >> n >> q;
A=new int[n];
B=new int[n];
J=new int[n];
C=new int[q];
for (int i=0;i<n;i++) {
cin >> A[i];
}
for (int i=0;i<n;i++) {
cin >> B[i];
}
J[0]=0;
for (int j=1;j<n+1;j++) {
J[j]=J[j-1]+(A[j-1]*B[j-1]);
}
for (int i=0;i<q;i++) {
cin >> l >> r;
if (r==1) {
C[i]=J[1];
}
else {
C[i]=J[r]-J[l-1];
}
}
for(int i=0;i<q;i++){
cout << C[i] << endl;
}
delete []A;
delete []B;
delete []C;
delete []J;
return 0;
}
завершение вызывается после создания экземпляра 'std::bad_array_new_length'
what(): std::bad_array_new_length
у вас наверняка есть доступ из массива, некоторый потенциальный доступ из массива и потенциальный незаконный размер выделения, см. мой ответ
Я настоятельно не рекомендую использовать DevC++, он не разработан должным образом и имеет множество проблем. Если вам нужна бесплатная IDE, здесь есть множество en.wikipedia.org/wiki/…, которые более эффективно удовлетворят ваши потребности, из которых я бы лично рекомендовал Code::Blocks, Eclipse или Visual Studio.
Несвязанные: старайтесь давать своим вопросам описательные названия. Программистам, которые следят за вами, будет легче найти ваш вопрос. Точно так же попробуйте дать своим идентификаторам осмысленные имена. Всем будет проще, если переменные будут названы в честь того, что они содержат или представляют, а функции будут названы в честь того, что они делают. Кроме того, опечатка в многобуквенном идентификаторе труднее проскользнуть через компилятор, чем если вы случайно используете A
там, где вы хотели использовать B
.
Имея
cin >> n >> q; A=new int[n]; B=new int[n]; J=new int[n]; C=new int[q];
вы проверяете, вводите ли вы допустимые размеры, даже не что-то
what(): std::bad_array_new_length
указывает, что значение н и/или д слишком велико для new [n]
или new[q]
. Очень вероятно, что это происходит, если вы вводите отрицательные целые числа (размер неподписанный), или может быть в том случае, если вы не вводите 2 действительных целых числа, поэтому по крайней мере одна из переменных не инициализирована (неопределенное поведение), или, конечно, если вы вводите как минимум очень большое целое число.
В общем все cin >> ...
, должно быть if (!(cin >> ...)) { ...error management ... }
Так сделайте хотя бы:
if (!(cin >> n >> q) || (n < 1) || (q < 1)) {
cerr << "invalid sizes" << endl;
return -1;
}
Имея
J=new int[n]; ... for(int j=1;j<n+1;j++){ J[j]=J[j-1]+(A[j-1]*B[j-1]); }
J[j]
стоит J[n]
на последнем ходу, поэтому вы записываете из выделенного массива
Также в
for(int i=0;i<q;i++){
cin >> l >> r;
if (r==1){
C[i]=J[1];
}
else{
C[i]=J[r]-J[l-1];
}
вы не проверяете, что значения л и р являются допустимыми индексами, а также если в качестве входных данных было задано целое число
cin >> l >> r;
может быть что-то вроде
if (!(cin >> l >> r) ||
(r < 0) || (r >= n) ||
(l < 1) || (l >= (n - 1))) {
cerr << "invalid indexes" << endl;
return -1;
}
Попробуйте напечатать значение для
n
иq
, чтобы увидеть, имеет ли это смысл.