Submission #107382

#TimeUsernameProblemLanguageResultExecution timeMemory
107382DiuvenGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++14
100 / 100
261 ms3644 KiB
#include <bits/stdc++.h> using namespace std; typedef long long lint; typedef pair<int, int> pii; const int INF = 1<<20; int n; char ST[410]; int P[3][410], S[3][410], F[3]; int D[2][410][410][3]; inline int _min(int x, int y){ return x<y ? x : y; } inline int _max(int x, int y){ return x>y ? x : y; } int dist(int r, int g, int y, int x){ int res = 0, C[3] = {r,g,y}; for(int k=0; k<3; k++) res += _max(0, S[k][x]-C[k]); return res; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>(ST+1); { int T[128]={}; T['R'] = 0, T['G'] = 1, T['Y'] = 2; for(int i=1; i<=n+1; i++) for(int k=0; k<3; k++) P[k][i] = INF; for(int i=1; i<=n; i++){ int x = T[int(ST[i])]; P[x][++F[x]] = i; for(int k=0; k<3; k++) S[k][i] = S[k][i-1]; S[x][i]++; } } for(int r=0; r<=n; r++) for(int g=0; g<=n; g++) for(int c=0; c<3; c++) D[0][r][g][c] = INF; D[0][0][0][0] = D[0][0][0][1] = D[0][0][0][2] = 0; for(int i=1; i<=n; i++){ int z = i&1; for(int r=0; r<=F[0]; r++) for(int g=0; g<=F[1]; g++){ int U[3] = {r, g, i-r-g}; for(int c=0; c<3; c++){ if(U[c]<1 || U[2]>F[2]){ D[z][r][g][c] = INF; continue; } U[c]--; int cost = dist(U[0],U[1],U[2],P[c][U[c]+1]-1); int get = _min(D[!z][U[0]][U[1]][(c+1)%3], D[!z][U[0]][U[1]][(c+2)%3]); D[z][r][g][c] = _min(INF, cost + get); U[c]++; } } // for(int r=0; r<=F[0]; r++, cout<<'\n') for(int g=0; g<=F[1]; g++, cout<<'\n'){ // for(int c=0; c<3; c++) cout<<D[z][r][g][c]<<' '; // } // cout<<'\n'; } int ans = INF; for(int r=0; r<=F[0]; r++) for(int g=0; g<=F[1]; g++) for(int c=0; c<3; c++) ans = _min(ans, D[n&1][r][g][c]); if(ans>=INF) ans = -1; cout<<ans<<'\n'; 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...