Не можете найти разницу, почему один код работает, а другой показывает ошибку во время выполнения для Вопроса, заданного в вызове Snackdown'19 codechef? - PullRequest
0 голосов
/ 16 октября 2018

Вопрос SPREAD2 задан в Snackdown'19 вызов кодекса:

Есть N человек, пронумерованных от 1 до N. Первоначально только человек 1 знает о Snackdown.Каждый день каждый, кто уже знает о Snackdown, рассказывает об этом другим людям.Для каждого действительного я, человек, я могу сказать до Ai людей в день.Люди распространяют информацию среди людей, которые не знают о Snackdown, в порядке возрастания их индексов;Вы можете предположить, что никакие два человека не пытаются рассказать кому-то об Snackdown одновременно.Каждому человеку разрешено начинать рассказывать другим людям о Закусках с того дня, когда он узнает об этом (человек 1 может начать рассказывать другим людям уже в первый день).Сколько дней нужно, чтобы все люди узнали о Snackdown?

Input : первая строка ввода содержит одно целое число T, обозначающее количество тестовых случаев.Описание Т-тестов приведено ниже.Первая строка каждого тестового примера содержит одно целое число N. Вторая строка содержит N разделенных пробелом целых чисел A1, A2,…, AN.

Выходные данные : для каждого тестового примера выведитеодна строка, содержащая одно целое число - количество дней.

Один код для этого вопроса показывает ошибку времени выполнения, а второй работает отлично.Спрашивается в квалификационном раунде Snakedown'19.Поскольку конкурс окончен, я хочу уточнить, почему этот код показывает ошибку времени выполнения

#include<bits/stdc++.h>
using namespace std;
int main() {
    int t,s;
    int n;
    cin>>t;
    int count;
    while(t--) {
        count=0;
        cin>>n;
        int B[1000009];
        cin>>B[0];
        for (int i = 1; i < n; ++i) {cin>>s;B[i]=B[i-1]+s;}
        for(int i=1;i<n;i+=B[i-1]) {
            count++;            
        }
        cout<<count<<'\n';
    }  
    return 0;
}

при выполнении с циклом while в этот код

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
  int q;
  ll n;
  ll s;
  ll B[1000005];
  ll l,count;
  cin>>q;
  while(q--) {
    l=1;
    count=0;
    cin>>n;
    cin>>B[0];
    for(int i=1;i<n;i++) {
      cin>>s;
      B[i] = B[i-1]+s;
    }
    while(l<n) {
      count++;
      l+=B[l-1];
    }
    cout<<count<<"\n";
  }
  return 0;
}

Похоже, работает правильно.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 17 октября 2018

Обе программы содержат строку cin >> n;, но первая использует operator>>(istream&, int&), а вторая - operator>>(istream&, long long&).

Этот шаблон повторяется для всех вызовов извлечения потока.

Когда вход не соответствует int, эти два будут вести себя очень по-разному.

...