Problem p00457 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <iostream>
#include <vector>
using namespace std;

vector<pair<int, int>> tougou(vector<pair<int, int>> x) {
  int siz = x.size();
  pair<int, int> p;
  if (siz != 0)
    p = x[0];
  vector<pair<int, int>> ans;
  for (int i = 1; i < siz; i++) {
    if (p.first != x[i].first) {
      ans.push_back(p);
      p = x[i];
    } else {
      p.second += x[i].second;
    }
  }
  ans.push_back(p);
  return ans;
}

int solve(vector<pair<int, int>> x) {
  vector<pair<int, int>> vp;
  int siz = x.size();
  bool update;
  for (;;) {
    update = false;
    for (int i = 0; i < siz; i++) {
      if (x[i].second < 4) {
        vp.push_back(x[i]);
      } else
        update = true;
    }
    if (!update)
      break;
    x = tougou(vp);
    siz = x.size();
    vp.clear();
  }
  // if(update)return solve(tougou(vp));
  siz = vp.size();
  int ans = 0;
  for (int i = 0; i < siz; i++) {
    ans += vp[i].second;
  }
  return ans;
}

int main() {
  while (1) {
    int n, a, ans = 100000;
    pair<int, int> p;
    p.second = 1;
    vector<pair<int, int>> vp;
    scanf("%d", &n);
    if (n == 0)
      break;
    ans = n;
    for (int i = 0; i < n; i++) {
      scanf("%d", &p.first);
      vp.push_back(p);
    }
    for (int i = 0; i < n; i++) {
      int sav = vp[i].first;
      for (int j = 1; j <= 3; j++) {
        bool c = false;
        if (i >= 3)
          if (vp[i - 3].first == vp[i - 2].first &&
              vp[i - 2].first == vp[i - 1].first && vp[i - 1].first == j)
            c = true;
        if (i >= 2)
          if (vp[i + 1].first == vp[i - 2].first &&
              vp[i - 2].first == vp[i - 1].first && vp[i - 1].first == j)
            c = true;
        if (i >= 1)
          if (vp[i + 1].first == vp[i + 2].first &&
              vp[i + 2].first == vp[i - 1].first && vp[i - 1].first == j)
            c = true;
        if (vp[i + 1].first == vp[i + 2].first &&
            vp[i + 2].first == vp[i + 3].first && vp[i + 3].first == j)
          c = true;
        if (c) {
          vp[i].first = j;
          int an = solve(tougou(vp));
          if (an < ans)
            ans = an;
        }
      }
      vp[i].first = sav;
    }
    printf("%d\\n", ans);
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <iostream>
#include <vector>
using namespace std;

vector<pair<int, int>> tougou(vector<pair<int, int>> x) {
  int siz = x.size();
  pair<int, int> p;
  if (siz != 0)
    p = x[0];
  vector<pair<int, int>> ans;
  for (int i = 1; i < siz; i++) {
    if (p.first != x[i].first) {
      ans.push_back(p);
      p = x[i];
    } else {
      p.second += x[i].second;
    }
  }
  ans.push_back(p);
  return ans;
}

int solve(vector<pair<int, int>> x) {
  vector<pair<int, int>> vp;
  int siz = x.size();
  bool update;
  for (;;) {
    update = false;
    for (int i = 0; i < siz; i++) {
      if (x[i].second < 4) {
        vp.push_back(x[i]);
      } else
        update = true;
    }
    if (!update)
      break;
    x = tougou(vp);
    siz = x.size();
    vp.clear();
  }
  // if(update)return solve(tougou(vp));
  siz = vp.size();
  int ans = 0;
  for (int i = 0; i < siz; i++) {
    ans += vp[i].second;
  }
  return ans;
}

int main() {
  while (1) {
    int n, a, ans = 100000;
    pair<int, int> p;
    p.second = 1;
    vector<pair<int, int>> vp;
    scanf("%d", &n);
    if (n == 0)
      break;
    for (int i = 0; i < n; i++) {
      scanf("%d", &p.first);
      vp.push_back(p);
    }
    for (int i = 0; i < n; i++) {
      int sav = vp[i].first;
      for (int j = 1; j <= 3; j++) {
        vp[i].first = j;
        int an = solve(tougou(vp));
        if (an < ans)
          ans = an;
      }
      vp[i].first = sav;
    }
    printf("%d\\n", ans);
  }
  return 0;
}