topcoder SRM 625 DIV2 IncrementingSequence

OpenSoucre發表於2014-06-20

由於題目資料量比較小,故可以開闢一個陣列儲存每個index出現的次數

然後遍歷即可

string canItBeDone(int k, vector<int> A){
    vector<int> cnt(52,0);
    int n = A.size();
    for(int i = 0 ; i < n; ++ i) cnt[A[i]]++;
    for(int i = 1 ; i <=n ; ++ i){
        if(cnt[i] !=0 ){
            cnt[i] -- ;
        }else{
            bool flag = false;
            for(int j = 1 ; j < i; ++ j ){
                if(cnt[j] &&(i-j)%k == 0){
                    cnt[j]--;
                    flag = true;
                    break;
                }
            }
            if(!flag) return "IMPOSSIBLE";
        }
    }
    return "POSSIBLE";
}

如果資料量比較大,可以考慮用hash_map儲存

    string canItBeDone(int k, vector <int> A) {
        map<int,int> kmap;
        for(int i = 0 ; i < A.size(); ++ i){
            if(kmap.find(A[i])!=kmap.end()){
                kmap[A[i]]++;
            }else{
                kmap.insert(make_pair(A[i],1));
            }
        }
        for(int i = 1; i <= A.size(); ++ i){
            if(kmap.find(i)!=kmap.end()){
                kmap[i]--;
                if(kmap[i] == 0) kmap.erase(i);
            }else{
                bool flag = false;
                for(map<int,int>::iterator iter = kmap.begin(); iter!=kmap.end(); iter++){
                    if((i-iter->first)>0 &&(i-iter->first)%k ==0){
                        iter->second--;
                        flag = true;
                        if(iter->second == 0){
                            kmap.erase(iter);
                        }
                        break;
                    }
                }
                if(!flag) return "IMPOSSIBLE";
            }
        }
        return "POSSIBLE";
    }
View Code

 

相關文章