Автогрейдер USACO дает другой ответ, чем моя машина - PullRequest
0 голосов
/ 15 января 2019

Я работаю над задачей USACO, и грейдер выдает 4, в то время как моя машина дает 3, правильный ответ.

Ввод:

4

7 Милдред + 3

4 Элси -1

9 Милдред -1

1 Бесси + 2

Я выполнил это через отладчик, и проблем не обнаружено.

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>
using namespace std;

int N, bmilk=7, emilk=7, mmilk=7;
int bboard=0, eboard=0, mboard=0;
int ans=0;
vector<pair<int,pair<string,int>>> a;

int main()
{
  ofstream fout("measurement.out");
  ifstream fin("measurement.in");
  fin >> N;
  for (int i = 0; i < N; i++)
  {
    int d, chg;
    string c;
    fin >> d >> c >> chg;
    a.push_back(make_pair(d,make_pair(c,chg)));
  }
  sort(a.begin(), a.end());
  for (int i = 0; i < N; i++)
  {
    if (a[i].second.first=="Bessie") bmilk+=a[i].second.second;
    else if (a[i].second.first=="Elsie") emilk+=a[i].second.second;
    else mmilk+=a[i].second.second;
    int best_milk = max(bmilk,max(emilk,mmilk));
    int curr_board[4];
    for (int j = 0; j < 3; j++) curr_board[i]=0;
    if (bmilk==best_milk) curr_board[0]=1;
    if (emilk==best_milk) curr_board[1]=1;
    if (mmilk==best_milk) curr_board[2]=1;
    if (curr_board[0]!=bboard||curr_board[1]!=eboard||curr_board[2]!=mboard)
    {
      ans++;
      bboard=curr_board[0];
      eboard=curr_board[1];
      mboard=curr_board[2];
    }
  }
  fout << ans << "\n";
  return 0;
}

Может кто-нибудь, пожалуйста, помогите мне найти причину этой ошибки?

1 Ответ

0 голосов
/ 15 января 2019

Вы читаете неинициализированные элементы curr_board, и вы также можете его переполнить.

Проблема в том, что строка, предназначенная для инициализации нескольких элементов, вместо этого присваивает один и тот же элемент снова и снова:

for (int j = 0; j < 3; j++) curr_board[i]=0;

Чтение неинициализированных значений является неопределенным поведением и может легко привести к разным результатам на разных машинах. То же самое для доступа за границу.

Почему curr_board в любом случае имеет размер 4?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...