제출 #109997

#제출 시각아이디문제언어결과실행 시간메모리
109997ArturgoGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++14
100 / 100
197 ms96120 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <array>
using namespace std;

int INFINI = 32000;
int nbPots;
string couleurs;

int ids[256];
vector<int> positions[3];
int nbAvant[3][401];
short dyn[401][401][401][3];

int main() {
  ios_base::sync_with_stdio(false);
  cin >> nbPots;
  cin >> couleurs;

  ids['R'] = 0;
  ids['G'] = 1;
  ids['Y'] = 2;

  for(int iPot = 0;iPot < nbPots;iPot++) {
    positions[ids[(int)couleurs[iPot]]].push_back(iPot);

    for(int iCouleur = 0;iCouleur < 3;iCouleur++) {
      nbAvant[iCouleur][iPot + 1] = nbAvant[iCouleur][iPot];
    }
    nbAvant[ids[(int)couleurs[iPot]]][iPot + 1]++;
  }

  for(int iR = 0;iR <= (int)positions[0].size();iR++) {
    for(int iG = 0;iG <= (int)positions[1].size();iG++) {
      for(int iY = 0;iY <= (int)positions[2].size();iY++) {
        for(int derCouleur = 0;derCouleur < 3;derCouleur++) {
	  dyn[iR][iG][iY][derCouleur] = INFINI;
	}
      }
    }
  }

  for(int derCouleur = 0;derCouleur < 3;derCouleur++) {
    dyn[0][0][0][derCouleur] = 0;
  }
  
  for(int iR = 0;iR <= (int)positions[0].size();iR++) {
    for(int iG = 0;iG <= (int)positions[1].size();iG++) {
      for(int iY = 0;iY <= (int)positions[2].size();iY++) {
	array<int, 3> curCouleur = {iR, iG, iY};

	for(int derCouleur = 0;derCouleur < 3;derCouleur++) {
	  for(int suivCouleur = 0;suivCouleur < 3;suivCouleur++) {
	    if(suivCouleur != derCouleur && curCouleur[suivCouleur] != (int)positions[suivCouleur].size()) {
	      array<int, 3> suiv = curCouleur;
	      suiv[suivCouleur]++;

	      int pos = positions[suivCouleur][curCouleur[suivCouleur]];

	      int nbDeps = max(0, nbAvant[0][pos] - curCouleur[0])
		+ max(0, nbAvant[1][pos] - curCouleur[1])
		+ max(0, nbAvant[2][pos] - curCouleur[2]);

	      dyn[suiv[0]][suiv[1]][suiv[2]][suivCouleur] = min<int>(
		dyn[suiv[0]][suiv[1]][suiv[2]][suivCouleur],
		dyn[iR][iG][iY][derCouleur] + nbDeps
	      );
	    }
	  }
	}
      }
    }
  }

  int mini = INFINI;
  for(int derCouleur = 0;derCouleur < 3;derCouleur++) {
    mini = min<int>(mini, dyn[positions[0].size()][positions[1].size()][positions[2].size()][derCouleur]);
  }

  if(mini == INFINI)
    cout << -1 << endl;
  else
    cout << mini << endl;
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...