USACO平地机给出的响应与我的机器不同

时间:2019-01-15 02:25:29

标签: c++ c++11

我正在执行USACO任务,并且平地机输出4,而我的机器给出3,是正确的答案。

输入为:

4

7 Mildred +3

4 Elsie -1

9 Mildred -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 :(得分:1)

您读取了curr_board的未初始化元素,并且也有可能使它超载。

问题是该行用于初始化多个元素,而是一遍又一遍地分配相同的元素:

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

读取未初始化的值是未定义的行为,并且很容易在不同的机器上导致不同的结果。同上用于越界访问。

为什么curr_board的尺寸为4?