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;
    }
}