AOJ 0534 - Chain
JOI予選の3問目は実装するだけだからとか高をくくった結果,2時間30分かかりました.残念.
1ヶ月ぶりだとしても,これはひどいので,お座なりな考える手順を変えることにします.
ちなみにChainberはChamberです.
#include<iostream> #include<vector> struct Chainber{ int color, size; }; std::vector<Chainber> v; int water(int uChain, int lChain){ int res = 0; for(;uChain>=0&&lChain<v.size();uChain--,lChain++){ if((v[uChain].color == v[lChain].color) && (v[uChain].size + v[lChain].size >= 4)){ res += v[uChain].size + v[lChain].size; } else{ break; } } return res; } int fish(int i, int abs){ int res = 0, uChain = i-1, lChain = i+1; res = v[i].size + 1; v[i+abs].size--; if(!v[i+abs].size){ if(i+abs*2 >= 0 && v[i].color == v[i+abs*2].color){ res += v[i+abs*2].size; *(abs<0?&uChain:&lChain) = i+abs*3; }else{ *(abs<0?&uChain:&lChain) = i+abs*2; } } res += water(uChain, lChain); v[i+abs].size++; return res; } int main(){ int n; while(std::cin >> n, n){ v.clear(); int prev_color = 0, size = 0; for(int i=0;i<n;i++){ int color; std::cin >> color; if(prev_color != color && prev_color){ v.push_back({prev_color, size}); size = 0; } size++; prev_color = color; } v.push_back({prev_color, size}); int minChara = n; for(int i=0;i<v.size();i++){ if(v[i].size >= 3){ minChara = std::min(minChara, n - (v[i].size + 1)); } } if(v.size() >= 3){ for(int i=1;i<v.size()-1;i++){ int destroyChara = 0, upperChara = i-1, lowerChara = i+1; //v[i]が両辺一個を変える if(v[i].size >= 3){ minChara = std::min(minChara, n - std::max(fish(i, -1), fish(i, 1))); } } } std::cout << minChara << std::endl; } }